题意:给出n个字符串,把它们排成n列。相邻两列上下有k个字母对应相同就可以获得k分,并可以添加前导空格。问最高分数。

题解:n最大才10,10!枚举排列,然后预处理任意两串字母的最大得分即可。

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 char s[12][12];
 6 int n,res;
 7 int cac[12][12];
 8 bool vis[12];
 9 void dfs(int k,int lx,int ans)
10 {
11     if(ans+(n-k)*10<=res)
12         return;
13     else if(k==n)
14     {
15         res=ans;
16         return;
17     }
18     for(int i=0;i<n;i++)
19     {
20         if(!vis[i])
21         {
22             vis[i]=true;
23             if(lx!=-1)
24                 dfs(k+1,i,ans+cac[lx][i]);
25             else
26                 dfs(k+1,i,0);
27             vis[i]=false;
28         }
29     }
30 }
31 int main()
32 {
33     while(scanf("%d",&n),n>0)
34     {
35         for(int i=0;i<n;i++)
36             scanf("%s",s[i]);
37         for(int i=0;i<n;i++)
38         {
39             for(int j=i+1;j<n;j++)
40             {
41                 if(i==j)
42                     continue;
43                 int cnt=0;
44                 for(int ii=0;s[i][ii]!='\0';ii++)
45                 {
46                     for(int jj=0;s[j][jj]!='\0';jj++)
47                     {
48                         int kk=0,cc=0;
49                         while(s[i][ii+kk]!='\0'&&s[j][jj+kk]!='\0')
50                         {
51                             if(s[i][ii+kk]==s[j][jj+kk])
52                                 cc++;
53                             kk++;
54                         }
55                         cnt=max(cnt,cc);
56                     }
57                 }
58                 cac[i][j]=cac[j][i]=cnt;
59             }
60         }
61         memset(vis,false,sizeof(vis));
62         res=0;
63         dfs(0,-1,0);
64         printf("%d\n",res);
65     }
66     return 0;
67 }