HDU1560(KB2-E IDA星)

DNA sequence

Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2427    Accepted Submission(s): 1198


Problem Description

The twenty-first century is a biology-technology developing century. We know that a gene is made of DNA. The nucleotide bases from which DNA is built are A(adenine), C(cytosine), G(guanine), and T(thymine). Finding the longest common subsequence between DNA/Protein sequences is one of the basic problems in modern computational molecular biology. But this problem is a little different. Given several DNA sequences, you are asked to make a shortest sequence from them so that each of the given sequence is the subsequence of it.

For example, given "ACGT","ATGC","CGTT" and "CAGT", you can make a sequence in the following way. It is the shortest but may be not the only one.

 

Input

The first line is the test case number t. Then t test cases follow. In each case, the first line is an integer n ( 1<=n<=8 ) represents number of the DNA sequences. The following k lines contain the k sequences, one per line. Assuming that the length of any sequence is between 1 and 5.
 

Output

For each test case, print a line containing the length of the shortest sequence that can be made from these sequences.
 

Sample Input

1
4
ACGT
ATGC
CGTT
CAGT
 

Sample Output

8
 

Author

LL

对公共串的每一位进行搜索,并使用IDA*剪枝

 1 //2017-03-07
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 
 6 using namespace std;
 7 
 8 string DNA[10];
 9 char ch[4] = {'A', 'T', 'C', 'G'};
10 int deep, n, pos[10];//pos[i]表示第i个DNA串匹配到了pos[i]位
11 bool ok;
12 
13 int Astar()//估价函数,返回当前状态最少还需要多少位
14 {
15     int h = 0;
16     for(int i = 0; i < n; i++)
17           if(h < DNA[i].length()-pos[i])
18               h = DNA[i].length()-pos[i];
19     return h;
20 }
21 
22 void IDAstar(int step)//枚举所求串每一位的字符,step表示所求串当前处理到哪一位。
23 {
24     if(ok)return;
25     int h = Astar();
26     if(step + h > deep)return;//剪枝
27     if(h == 0){//h为0表示短串全部处理完
28         ok = true;
29         return;
30     }
31     for(int i = 0; i < 4; i++)
32     {
33         int tmp[10];
34         for(int j = 0; j < n; j++)tmp[j] = pos[j];
35         bool fg = false;
36         for(int j = 0; j < n; j++)
37         {
38             if(DNA[j][pos[j]] == ch[i]){
39                 fg = true;//表示所求串第step为可以是ch[i]
40                 pos[j]++;
41             }
42         }
43         if(fg){
44             IDAstar(step+1);
45         }
46         for(int j = 0; j < n; j++)pos[j] = tmp[j];
47     }
48 }
49 
50 int main()
51 {
52     int T;
53     cin>>T;
54     while(T--)
55     {
56         cin>>n;
57         deep = 0;
58         for(int i = 0; i < n; i++)
59         {
60             cin>>DNA[i];
61             if(DNA[i].length() > deep)deep = DNA[i].length();
62         }
63         ok = false;
64         while(!ok)
65         {
66             memset(pos, 0, sizeof(pos));
67             IDAstar(0);
68             deep++;
69         }
70         cout<<deep-1<<endl;
71     }
72 
73     return 0;
74 }
原文地址:https://www.cnblogs.com/Penn000/p/6509512.html