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\n",ans); 103 return 0; 104 }
AC without art, no better than WA !