题目:
http://acm.hdu.edu.cn/showproblem.php?pid=1560
题意:
给出一些dna序列,找出一个最短的满足包含所有这些子字符串的字符串,只要字符串中各字母相对位置相同即可。
思路:
要找最短的满足包含所有串的字符串,慢慢扩大搜索范围寻找即可,就是IDA*,迭代加深搜索,不断加大搜索深度然后dfs判断是否有答案。
代码:
int n,m;
int sum,ans,res;
char s[10][5],c[5]="ACGT";
int len[10],pos[10];
int lenn()
{
int maxx=0;
for(int i=0;i<n;i++)
maxx=max(maxx,len[i]-pos[i]);
return maxx;
}
int dfs(int step)
{
int t=lenn();
if(step+t>res)
return step+t-res;
if(!t)
{
ans=1;
return 0;
}
int tmp[10],maxx=0;
memcpy(tmp,pos,sizeof(pos));
for(int i=0;i<4;i++)
{
int flag=0;
for(int j=0;j<n;j++)
if(s[j][pos[j]]==c[i])
flag=1,pos[j]++;
if(flag)
{
t=dfs(step+1);
if(ans)
return 0;
maxx=max(maxx,t);
}
memcpy(pos,tmp,sizeof(tmp));
}
return maxx;
}
int IDAStar()
{
int t;
ans=0;
while(1)
{
t=dfs(0);
if(ans)
break;
res+=t;
}
}
int main()
{
int i,j,k,kk,t,x,y,z;
scanf("%d",&k);
while(k--)
{
scanf("%d",&n);
res=0;
for(i=0;i<n;i++)
{
scanf("%s",s[i]);
len[i]=strlen(s[i]);
res=max(res,len[i]);
pos[i]=0;
}
IDAStar();
printf("%d\n",res);
}
return 0;
}