题目:http://poj.org/problem?id=1699
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 5467 | Accepted: 2146 |
Description
Input
Output
Sample Input
1 5 TCGG GCAG CCGC GATC ATCG
Sample Output
11分析:已知多个片段个体求极值问题,想到了动态规划。根据题意,两个字符串组合,如s1=“12345”,s2=“345678”新构成的字符串的长度比原来s1的长度要多3,把增加的长度存储在一个二维数组len[1][2]中。这样,对于以字符串si开头的由n个子串组合成的新的字符串的就是si+len(i,j,k,……)[ A(n-1,n-1)种组合情况]。那么怎样模拟这么多的组合情况呢?深度优先搜索。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int INF=0x3f3f3f3f; int getmore(char *s1,char *s2){ int length1=strlen(s1),length2=strlen(s2),i; int m,qi; if(length1>length2)qi=length1-length2; else qi=0; for(;qi<length1;qi++){ bool judge=1; for(int i=qi;i<length1;i++){ if(s1[i]!=s2[i-qi])judge=0; } if(judge)break; } return length2-length1+qi; } int len[11][11],length[11],N; char str[11][25]; int ans=INF; bool used[11]; void dfs(int dex,int length,int count){ if(length>ans)return ; if(count==N && length<ans){ ans=length; return ; } for(int i=0;i<N;i++){ if(used[i])continue; used[i]=1; dfs(i,length+len[dex][i],count+1); used[i]=0; } } int main() { //freopen("cin.txt","r",stdin); int t; cin>>t; while(t--){ scanf("%d",&N); ans=INF; memset(length,0,sizeof(length)); memset(used,0,sizeof(used)); memset(len,0,sizeof(len)); for(int i=0;i<N;i++){ scanf("%s",str[i]); length[i]=strlen(str[i]); } for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ len[i][j]=getmore(str[i],str[j]); } } for(int i=0;i<N;i++){ used[i]=1; dfs(i,length[i],1); used[i]=0; } printf("%d\n",ans); } return 0; }