#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char s[10][10];
char ch[] = "ACGT";
int len[10],pos[10];
int res,n;
int h(){ //估计将要走的步数
int ret = 0;
for(int i=0;i<n;i++)
ret = max(ret,len[i]-pos[i]); //还没有匹配的最大的位数,即为最大深度
return ret;
}
bool dfs(int step){
if(step+h() > res) return 0; //超过了当前最大的长度,不满足约束条件
if(h()==0) return 1; //所有的都已经匹配完成,即完全匹配
int tmp[10]; //保存现场,用于回溯的时候恢复现场用
for(int i=0;i<4;i++){ //枚举当前匹配哪个字母
bool flag = 0;
for(int j=0;j<n;j++)
tmp[j] = pos[j];
for(int j=0;j<n;j++){
if(s[j][pos[j]] == ch[i]){
flag = 1;
pos[j]++; //已经匹配的位数增加一位
}
}
if(flag){ //防止当前所有位都没有该字符
if(dfs(step+1))
return 1;
for(int j=0;j<n;j++)
pos[j] = tmp[j];
}
}
return 0;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
// int n;
scanf("%d",&n);
res = 0;
for(int i=0;i<n;i++){
scanf("%s",s[i]);
len[i] = strlen(s[i]); //当前串的长度
pos[i] = 0; //当前匹配到了第几位
res = max(res,len[i]); //记录当前最大的长度
}
while(1){
if(dfs(0)) break;
res++;
}
printf("%d\n",res);
}
return 0;
}
HDU 1560 DNA sequence dfs
最新推荐文章于 2022-10-15 16:14:03 发布