1 4 ACGT ATGC CGTT CAGT
8
找到最短的DNA序列 其子序列包含题意所给的DNA
IDA* 估价函数为最长剩余DNA数量
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<cmath> #include<string> #include<vector> #include<algorithm> #include<map> #include<set> #define inf 1<<30 #define LL long long #define maxn 1<<24 using namespace std; char str[10][10];//保存DNA int l[10]; int t,n; int tlen; bool flag; int get_h(int * a) //估价函数 { int ans=0; for(int i=0; i<n; i++) { ans=max(ans,a[i]); } return ans; } void dfs(int len,int * a) { if(flag) return ; if(get_h(a)>len) return ;//预估值小于最优估计值 if(len==0) //找到序列 { flag=true ; return ; } bool vis[10]; memset(vis,false ,sizeof(vis)); for(int i=0; i<n; i++) { if(a[i]==0||vis[i]) continue ; int ee[10]; for(int ii=0; ii<n; ii++) ee[ii]=a[ii]; vis[i]=true ; char ch=str[i][l[i]-a[i]]; ee[i]--; for(int j=i+1; j<n; j++) { if(ee[j]==0||vis[j]) continue ; if(str[j][l[j]-a[j]]==ch) { vis[j]=true ; ee[j]--; } } dfs(len-1,ee); } return ; } int main() { scanf("%d",&t); while(t--) { tlen=0; flag=false ; scanf("%d",&n); int ee[10]; for(int i=0; i<n; i++) { scanf("%s",str[i]); ee[i]=strlen(str[i]); l[i]=ee[i]; tlen=max(ee[i],tlen); } while(1) { dfs(tlen,ee); if(flag) break; tlen++; } printf("%d\n",tlen); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/u013097262/article/details/49721579