标签:example seq tput c++ otto number ssi mem tween
Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6042 Accepted Submission(s): 2735
给出k个以A C G T为元素的字符串,求以他们为子串的字符串的最短长度
IDA*,枚举ACGT,如果匹配,就进入下一层
#include<bits/stdc++.h> using namespace std; string a[10]; int cnt[10],t,k,minl; char s[5]="ACGT"; bool dfs(int now,int step) { int flag=1; for(int i=0;i<k;i++) { if(cnt[i]!=a[i].size()) { flag=0; } if(a[i].size()-cnt[i]>(step-now+1)) //剪枝,所剩的长度过长 return false; } if(flag) return true; if(now>step) return false; for(int i=0;i<4;i++) { int next=0; int temp[10]; for(int j=0;j<k;j++) { temp[j]=cnt[j]; if(cnt[j]!=a[j].size()) { if(a[j][cnt[j]]==s[i]) { cnt[j]++; next=1; } } } if(next) //如果可以匹配,进入下一层 { if(dfs(now+1,step)) return true; for(int j=0;j<k;j++) { cnt[j]=temp[j]; //回溯 } } } return false; } int main() { cin>>t; while(t--) { minl=0; cin>>k; for(int i=0;i<k;i++) { cin>>a[i]; int l=a[i].size(); minl=max(minl,l); } int anss; memset(cnt,0,sizeof(cnt)); for(int i=minl;;i++) { if(dfs(1,i)) { anss=i; break; } } cout<<anss<<endl; } }
标签:example seq tput c++ otto number ssi mem tween
原文地址:https://www.cnblogs.com/dyhaohaoxuexi/p/12689640.html