题意:给定n个DNA字符串,然后可以让两个DNA端点部分交叉,条件是这端点部分能够匹配。问将n个DNA连成一串的最小长度。
题解:像这种n那么小的题就是在诱惑人去暴力,枚举n个DNA的构造顺序,然后依次连接。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 bool vis[10]; 6 char s[10][10]; 7 int n,ans,per[10]; 8 void link(char s1[],char s2[]) 9 { 10 for(int i=0;s1[i]!='\0';i++) 11 { 12 int k=0; 13 while(s1[i+k]!='\0'&&s2[k]!='\0'&&s1[i+k]==s2[k]) 14 k++; 15 if(s1[i+k]=='\0') 16 { 17 strcat(s1,s2+k); 18 return; 19 } 20 } 21 strcat(s1,s2); 22 } 23 int solve() 24 { 25 char ss[100]; 26 ss[0]='\0'; 27 for(int i=0;i<n;i++) 28 link(ss,s[per[i]]); 29 return strlen(ss); 30 } 31 void dfs(int pos) 32 { 33 if(pos==n) 34 { 35 ans=min(solve(),ans); 36 return; 37 } 38 for(int i=0;i<n;i++) 39 { 40 if(!vis[i]) 41 { 42 vis[i]=true; 43 per[pos]=i; 44 dfs(pos+1); 45 vis[i]=false; 46 } 47 } 48 } 49 int main() 50 { 51 while(scanf("%d",&n)!=EOF) 52 { 53 for(int i=0;i<n;i++) 54 scanf("%s",s[i]); 55 ans=10000; 56 memset(vis,false,sizeof(vis)); 57 dfs(0); 58 printf("%d\n",ans); 59 } 60 return 0; 61 }