• 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
  • 相关阅读:
    java 单向链表实现
    super、this
    Java程序员们最常犯的10个错误
    Codeforces-1323D Present
    Codeforces-1323E Instant Noodles
    Codeforces-1312E Array Shrinking
    Codeforces-1327D Infinite Path
    Codeforces-1326D Prefix-Suffix Palindrome
    HDU-5885 XM Reserves
    NTT(快速数论变换)用到的各种素数及原根
  • 原文地址:https://www.cnblogs.com/zig-zag/p/4852559.html
Copyright © 2020-2023  润新知