zoukankan      html  css  js  c++  java
  • poj2817WordStack(状压)

    链接

    与上题类似  预处理一下各字符串之间最大的相同字符数就可以 注意dp要初始为负无穷 

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<stdlib.h>
     5 #include<algorithm>
     6 using namespace std;
     7 #define N 1050
     8 int dp[N][11],k[11],q[2][N],w[12][12],f[N];
     9 char s[11][11];
    10 int compare(int x,int y)
    11 {
    12     int i,j,maxz=0;
    13     for(i = 0 ; i < k[x] ; i++)
    14         for(j = 0 ; j < k[y] ; j++)
    15         {
    16             if(s[x][i]==s[y][j])
    17             {
    18                 int ii = i+1,jj = j+1,o=1;
    19                 while(ii<k[x]&&jj<k[y])
    20                 {
    21                     if(s[x][ii]==s[y][jj])
    22                     o++;
    23                     ii++;jj++;
    24                 }
    25                 maxz = max(o,maxz);
    26             }
    27         }
    28     return maxz;
    29 }
    30 int main()
    31 {
    32     int i,j,n,e,o;
    33     while(scanf("%d%*c",&n)&&n)
    34     {
    35         int kk=0;
    36         memset(w,0,sizeof(w));
    37         memset(dp,128,sizeof(dp));
    38         memset(f,0,sizeof(f));
    39         for(i = 0; i < n ; i++)
    40         {
    41             scanf("%s",s[i]);
    42             k[i] = strlen(s[i]);
    43         }
    44         for(i =0 ; i < n ;i++)
    45         {
    46             q[0][i] = 1<<i;
    47             dp[1<<i][i] = 0;
    48         }
    49         kk = n;
    50         for(i =0; i < n ; i++)
    51             for(j = i+1; j < n ; j++)
    52             {
    53                 w[i][j] = compare(i,j);
    54                 w[j][i] = w[i][j];
    55             }
    56         for(i = 1 ; i < n ; i++)
    57         {
    58             int tt=0;
    59             for(j = 0 ; j < kk ; j++)
    60             {
    61                 for(e = 0 ; e < n ; e++)
    62                 {
    63                     for(o = 0 ; o < n ; o++)
    64                     {
    65                         if(((~q[(i-1)%2][j])&(1<<o))==0)
    66                         continue;
    67                         int oo = q[(i-1)%2][j]+(1<<o);
    68                         if(o==e)
    69                         continue;
    70                         dp[oo][o] = max(dp[oo][o],dp[q[(i-1)%2][j]][e]+w[e][o]);
    71                         if(!f[oo])
    72                         {
    73                             q[i%2][tt++] = oo;
    74                             f[oo] = 1;
    75                         }
    76                     }
    77                 }
    78             }
    79             kk = tt;
    80         }
    81         int ans = 0;
    82         for(i = 0 ; i < n ;i++)
    83         ans = max(ans,dp[(1<<n)-1][i]);
    84         printf("%d
    ",ans);
    85     }
    86     return 0;
    87 }
    View Code
  • 相关阅读:
    【转】前端开发工程师如何在2013年里提升自己
    【转】再谈PHP、Python与Ruby
    【转】从知乎上看到“全栈开发者”讨论之后的自黑
    C#精髓 第四讲 GridView 72般绝技
    web网站第一次加载慢的解决方法
    SQL SERVER 提供了一些时间函数:
    Eval() 中数据格式化或格式化数据
    SQL SERVER 取本月上月日期
    LINQ to SQL连接数据库及语句
    权限管理
  • 原文地址:https://www.cnblogs.com/shangyu/p/3267889.html
Copyright © 2011-2022 走看看