题意:给出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 }