DNA sequence HDU 1560

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值