标签:
1 4 ACGT ATGC CGTT CAGT
8
使用dfs进行搜索,但限制递归深度。
逐步加深搜索深度,直至找到答案。
主函数中, 限制搜索深度,如果无解,就加深1层深度
强力剪枝: 递归函数中, 首先计算最坏情况下,还需要补充长度:
为每个DNA序列还未匹配的长度之和(sum)。
如果现在搜索深度+sum>限定的搜索深度,则返回
#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; char f[4]={‘A‘,‘T‘,‘G‘,‘C‘}; int flag,i,t,n,maxlen; int cnt[50]; char str[10][10]; void dfs(int len,int cnt[]) { if (flag || len>maxlen) return; int sum=0; for(int i=0;i<n;i++) //关键 :ida*(迭代加深搜索) { int l=strlen(str[i]); sum=max(sum,l-cnt[i]); } if (sum+len>maxlen) return; if (sum==0) {flag=1; return;} for(int i=0;i<4;i++) { char x=f[i]; int next[50]; int tflag=0; for(int j=0;j<n;j++) if (str[j][cnt[j]]==x) { next[j]=cnt[j]+1; tflag=1; } else next[j]=cnt[j]; if (tflag) dfs(len+1,next); //更新了才说明有效 } return; } int main() { scanf("%d",&t); for(;t>0;t--) { scanf("%d",&n); maxlen=0; for(i=0;i<n;i++) { scanf("%s",str[i]); int l=strlen(str[i]); maxlen=max( maxlen,l ); } flag=0; memset(cnt,0,sizeof(cnt)); for(i=0;i<40;i++) { dfs(0,cnt); if (flag) break; maxlen++; } printf("%d\n",maxlen); } return 0; }
标签:
原文地址:http://www.cnblogs.com/stepping/p/5674923.html