JAG Summer 2012 Day 4 C Connect

状压dp,由于枚举两维状态会GG,所以只枚举当前位置前m个的状态,就是这个样子大概= =;

呆马:

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <algorithm>
  4 #include <cstring>
  5 #include <cmath>
  6 #include <vector>
  7 #include <queue>
  8 #define inf 1000000007
  9 #define maxn 130
 10 #define maxm 18
 11 
 12 using namespace std;
 13 
 14 int f[2][maxm][65538];
 15 int bit[65538][maxm];
 16 char s[maxn][maxm];
 17 int len[maxn];
 18 int n,m,mxbit,hi;
 19 
 20 int up(int x, int y, int mask)
 21 {
 22     int cnt=len[x-1], now=0;;
 23     for (int i=y;i<m;i++) cnt-=bit[mask][i];
 24     for (int i=1;i<y;i++) now+=bit[mask][i];
 25     if (bit[mask][m] && s[x-1][cnt-1]==s[x][now]) return 1;
 26     return 0;
 27 }
 28 
 29 int lf(int x, int y, int mask)
 30 {
 31     int now=0;
 32     for (int i=1;i<y;i++) now+=bit[mask][i];
 33     if (bit[mask][1] && s[x][now-1]==s[x][now]) return 1;
 34     return 0;
 35 }
 36 
 37 int cal(int y, int mask)
 38 {
 39     int now=0;
 40     for (int i=1;i<=y;i++) now+=bit[mask][i];
 41     return now;
 42 }
 43 
 44 void get_mask()
 45 {
 46     for (int i=1;i<=mxbit;i++)
 47     {
 48         int now=i;
 49         for (int j=1;j<=m;j++)
 50         {
 51             bit[i][j]=now%2;
 52             now/=2;
 53         }
 54     }
 55 }
 56 
 57 int main()
 58 {
 59     scanf("%d%d",&n,&m);
 60     mxbit=(1<<m)-1;
 61     get_mask();
 62     for (int i=1;i<=n;i++) 
 63     {
 64         scanf("%s",s[i]);
 65         len[i]=strlen(s[i]);
 66     }
 67     for (int i=0;i<=1;i++)
 68         for (int j=1;j<=m;j++)
 69         {
 70             for (int mask=0;mask<=mxbit;mask++)
 71                 f[i][j][mask]=-inf;
 72         }
 73     f[1][1][0]=f[1][1][1]=0;
 74     for (int i=1;i<=n;i++)
 75     {
 76         int p=i&1;
 77         for (int j=1;j<=m;j++)
 78             for (int mask=0;mask<=mxbit;mask++)
 79             {
 80                 int tmp=(mask<<1)&mxbit;
 81                 if (i==1 && j==1) continue;
 82                 if (j==1)
 83                 {    
 84                     if (cal(m,mask)!=len[i-1]) continue;
 85                     f[p][j][tmp]=max(f[p][j][tmp],f[p^1][m][mask]);
 86                     f[p][j][tmp|1]=max(f[p][j][tmp|1],f[p^1][m][mask]+2*up(i,j,mask));
 87                 }
 88                 else
 89                 {
 90                     if (cal(j-1,mask)>len[i]) continue;
 91                     f[p][j][tmp]=max(f[p][j][tmp],f[p][j-1][mask]);
 92                     if (cal(j-1,mask)<len[i])
 93                         f[p][j][tmp|1]=max(f[p][j][tmp|1],f[p][j-1][mask]+2*lf(i,j,mask)+2*up(i,j,mask));
 94 
 95                 }
 96             }
 97     }
 98     int ans=0;
 99     for (int mask=0;mask<=mxbit;mask++)
100         if (cal(m,mask)==len[n])
101             ans=max(ans,f[n&1][m][mask]);
102     printf("%d
",ans);
103     return 0;
104 }
Connect
原文地址:https://www.cnblogs.com/zig-zag/p/4852559.html