题意:给定n个DNA字符串,然后可以让两个DNA端点部分交叉,条件是这端点部分能够匹配。问将n个DNA连成一串的最小长度。

题解:像这种n那么小的题就是在诱惑人去暴力,枚举n个DNA的构造顺序,然后依次连接。

View Code
 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 }