POJ1699Best Sequence(DFS)

链接

这题其实是由bug的 一个串包含其它两个串的数据没有 所以就这么水了它吧 只处理两个串的关系就行了

回来补点。。看了huge的博客 发现其实不是有Bug  题意没读清楚 必须首尾相连 像AGCT GC这样就不算。。降低了复杂

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 using namespace std;
 7 #define INF 0x3f3f3f
 8 char s[22][22];
 9 int k[22],o[22][22],n;
10 int vis[22],ans;
11 void init()
12 {
13     int i,j;
14     for(i = 1 ; i <= n ; i++)
15     {
16         for(j =  1; j <= n ; j++)
17         {
18             if(i==j)
19             continue;
20             o[i][j] = 0;
21             for(int g = 0 ; g < k[i] ; g++)
22             {
23                 if(s[j][0]==s[i][g])
24                 {
25                     int k1 = 1,k2 = g+1;
26                     while(k1<k[i]&&k2<k[j]&&s[j][k1]==s[i][k2])
27                     {
28                         k1++;
29                         k2++;
30                     }
31                     if(k1==k[i]||k2==k[j])
32                     {
33                         o[i][j] = k1;
34                         break;
35                     }
36                 }
37             }
38         }
39     }
40 }
41 void dfs(int x,int v,int sum)
42 {
43     if(sum>ans)
44     return ;
45     if(v==n)
46     {
47         ans = sum;
48         return ;
49     }
50     int i;
51     for(i = 1; i <= n ; i++)
52     {
53         if(!vis[i])
54         {
55             vis[i] = 1;
56             sum+=(k[i]-o[x][i]);
57             dfs(i,v+1,sum);
58             sum-=(k[i]-o[x][i]);
59             vis[i] = 0;
60         }
61     }
62 }
63 int main()
64 {
65     int i,t;
66     scanf("%d",&t);
67     while(t--)
68     {
69         memset(vis,0,sizeof(vis));
70         ans = INF;
71         scanf("%d%*c",&n);
72         for(i = 1 ; i <= n ;i++)
73         {
74             scanf("%s",s[i]);
75             k[i] = strlen(s[i]);
76         }
77         init();
78         for(i = 1; i <= n ;i++)
79         {
80             vis[i] = 1;
81             dfs(i,1,k[i]);
82             vis[i] = 0;
83         }
84         printf("%d
",ans);
85     }
86     return 0;
87 }
View Code
原文地址:https://www.cnblogs.com/shangyu/p/3295912.html