题目链接
大佬说用迭代加深搜索,预处理加上剪枝判断
用C++提交一直超时,用G++能AC
#include<cstdio>
#include<cstring>
#include<string>
#include<cctype>
#include<cmath>
#include<algorithm>
using namespace std;
const char DNA[]="ACGT";
char str[10][10]; //记录字符串
int size[10]; //记录字符串长度
int pos[10]; //记录字符串当前匹配到哪个位置
int n,ans;
void dfs(int d,int dep){
if(d>=dep) return ;
//剪枝
int rsize=0;
for(int i=0;i<n;i++)
rsize=max(rsize,size[i]-pos[i]);
if(rsize>(dep-d)) return ;
if(rsize==0){ //搜索完成
ans=d;
return ;
}
bool flag; //标记是否有变化
int tmp[10]; //用来无变化时恢复现场
memcpy(tmp,pos,sizeof(pos));
for(int i=0;i<4;i++){
flag=false;
for(int j=0;j<n;j++)
if(str[j][pos[j]]==DNA[i]){ //迭代搜索到
pos[j]++;
flag=true;
}
if(!flag) continue;
dfs(d+1,dep);
if(ans!=-1) break;
memcpy(pos,tmp,sizeof(pos)); //恢复现场
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
int len=0; //首次迭代加深长度
for(int i=0;i<n;i++){
scanf("%s",str[i]);
size[i]=strlen(str[i]);
len=max(size[i],len);
}
ans=-1;
memset(pos,0,sizeof(pos));
while(1){
dfs(0,len);
if(ans!=-1) break;
len++;
}
printf("%d\n",ans);
}
return 0;
}