HDU 1560 DNA sequence IDA*

来源:互联网 发布:淘宝城三期 开业时间 编辑:程序博客网 时间:2024/05/22 02:01

题意:有四个元素ACGT,DNA的序列就是由这四个元素组成的,现在有n个DNA串,现在寻找这样一个串,即最短的序列并且n个DNA串是其子串。


想法:首先,我们设要求的串是str,那么可以知道str的长度至少大于等于n个DNA串里面最长的那个。所以可以从此长度为基础进行搜索,我们可以整体进行搜索,即按照ACGT的顺序,来枚举str第一个要放置的字母,如果n个DNA串里面有,就把他们的位置枚举位置+1,然后是枚举str的第二个,一次类推。如果不成立str长度+1,继续枚举。有一个减枝就是,if:当前str枚举完的长度+h(所有DNA串留下的最大长度)>str之前设置的长度;then return false;


#include<iostream>#include<cstring>using namespace std;int n;char epl[10]="ACGT";int pos[15],length;struct node{    char str[10];    int len;}info[15];int Max(int a,int b){    if(a>b) return a;    return b;}int h_len(){    int res=0;    for(int i=1;i<=n;i++)    {        res=Max(res,info[i].len-pos[i]);    }    return res;}bool dfs(int Len){    if(Len+h_len()>length) return false;    if(!h_len()) return true;    int tmp[15];    for(int i=0;i<4;i++)    {        int mark=0;        for(int j=1;j<=n;j++) tmp[j]=pos[j];        for(int j=1;j<=n;j++)        {            if(info[j].str[pos[j]]==epl[i])            {                mark=1;                pos[j]++;            }        }        if(mark)        {            if(dfs(Len+1)) return true;            for(int j=1;j<=n;j++) pos[j]=tmp[j];        }    }    return false;}int main(){    int t;    cin>>t;    while(t--)    {        cin>>n;        length=0;        for(int i=1;i<=n;i++)        {            cin>>info[i].str;            info[i].len=strlen(info[i].str);            pos[i]=0;            length=Max(length,info[i].len);        }        while(1)        {            if(dfs(0)) break;            length++;        }        cout<<length<<endl;    }    return 0;}[ Copy to Clipboard ]    [ Save to File]







































0 0