给你最多8个长度不超过5的DNA系列,求一个包含所有系列的最短系列。
迭代加深的经典题。(虽然自己第一次写)
定一个长度搜下去,搜不出答案就加深大搜的限制,然后中间加一些玄学的减枝
//Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<queue> #include<vector> using namespace std; int ans,T,n,sz[10],maxn,lim; char s[10][10],b[5]={‘A‘,‘T‘,‘C‘,‘G‘}; void dfs(int cnt,int len[]) { if(cnt>lim) return; int maxx=0; for(int i=1;i<=n;i++) maxx=max(maxx,sz[i]-len[i]); if(maxx==0) { ans=cnt; return; } if(cnt+maxx>lim) return; for(int i=0;i<4;i++) { int tep[10]; int flag=0; for(int j=1;j<=n;j++) { if(s[j][len[j]]==b[i]) { tep[j]=len[j]+1; flag=1; } else tep[j]=len[j]; } if(flag) dfs(cnt+1,tep); if(ans!=-1) break; } } int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); maxn=0; for(int i=1;i<=n;i++) { scanf("%s",s[i]); sz[i]=strlen(s[i]); maxn=max(maxn,sz[i]); } for(;;) { ans=-1; lim=maxn; int p[10]={0}; dfs(0,p); if(ans!=-1) break; maxn++; } printf("%d\n",ans); } return 0; }
时间: 2024-07-31 13:41:45