您的位置:首页 > 产品设计 > UI/UE

HDU-1560 DNA sequence

2015-09-25 22:36 441 查看

题目:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: