HDU-1560 DNA sequence

来源:互联网 发布:数据挖掘:概念与技术 编辑:程序博客网 时间:2024/06/05 20:17

题目:

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


0 0
原创粉丝点击