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
//迭代搜索, 可以说是很经典的题了
// 重点理解 len[i]数组 已经确定好的字符串中有几个是str[i]的子串
// 实在不行,自己跟着代码模拟一遍数据
#include<bits/stdc++.h>
using namespace std;
int n,deep;
char DNA[5] = { 'A','C','G','T'};
char str[10][10];
int strl[10];
int ans;
void dfs(int cnt , int len[]){
if( cnt > deep) //终止条件
return ;
int maxl = 0 ,tmp;
for( int i =0;i<n;i++){
tmp = strl[i] - len[i];
if( tmp > maxl)
maxl = tmp;
}
if(maxl ==0)
{
ans = cnt ;
return ;
}
if( maxl + cnt > deep) // 剪枝
return ;
int pos[10] = {0};
for( int i =0;i<4;i++){
int flag =0;
int pos[10] = {0};
for( int j =0 ;j < n ;j++){
if( str[j][len[j] ] == DNA[i] ){
flag = 1;
pos[j] = len[j] + 1;
}
else pos[j] = len[j];
}
if(flag )
dfs(cnt+1,pos);
if(ans!= -1)
break;
}
}
int main(void){
int t,maxl;
scanf("%d",&t);
while(t--){
maxl = 0;
scanf("%d",&n);
for(int i =0;i<n;i++){
scanf("%s",&str[i]);
strl[i] = strlen(str[i]);
if( strl[i] > maxl)
maxl = strl[i];
}
ans = -1;
deep = maxl;
int pos[10] = { 0} ;
while(1){ //迭代部分
dfs(0,pos);
if(ans !=-1)
break;
deep++;
}
printf("%d\n",ans);
}
return 0;
}