POJ 2817

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

你可能感兴趣的:(poj)