DFS深度优先搜索(4)--hdu1560(进阶题)

  DNA sequence

Time Limit: 5000MS     Memory Limit: 32768KB     64bit IO Format: %I64d & %I64u

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

Hint

        

         这道题题意:从n个串中找出一个最短的公共串(也许应该说序列吧,因为不要求连续,即只要保持相对顺序就好)。

      一开始我用的是BFS,但是一直MLE,真的悲剧~~后头看了大神的解题报告,发现了新天地,就是迭代加深搜索,所谓迭代加深搜索,就是限制DFS的深度,若搜不到答案,则加深深度,重新搜索,这样就防止了随着深度不断加深而进行的盲目搜索,而且,对于这种求最短长度之类的题目,只要找到可行解,即是最优解了。同时注意剪枝,每次DFS的时候,都要判断一下,当前的深度+最少还有加深的深度是否大于限制的长度,若是,则退回上一层状态。代码:

#include
#include
int n;     
int ans;        //最后答案 
char str[10][10];  //记录n个字符串
int deep;       //搜索深度
char DNA[4]={'A','T','C','G'};    //四种可能
int Max(int x,int y){     
	if(x>y)return x;
	else return y;
}
void Dfs(int index,int len[]){
	if(index>deep)return;        //大于限制的深度,不用往下搜索  
	int i,j,maxx=0;       //预计还要匹配的字符串的最大长度  
	for(i=0;ideep)      //剪枝 
		return;             //当前的深度+最少还有加深的深度是否大于限制的长度,若是,则退回
	for(i=0;i<4;i++){
		int flag=0;
		int pos[10];
		for(j=0;j


你可能感兴趣的:(【DFS(深度优先搜索)】)