zoukankan      html  css  js  c++  java
  • 初探插头dp

    开学那个月学了点新东西,不知道还记不记得了,mark一下

    感觉cdq的论文讲的很详细

    题主要跟着kuangbin巨做了几道基础的

    http://www.cnblogs.com/kuangbin/archive/2012/10/02/2710343.html

    还有几道没做,留着坑

    感觉广义括号表示法虽然神奇,但一般最小表示法就够用了吧,感觉最小表示法更直观一点

    hdu1693

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 typedef long long ll;
     5 using namespace std;
     6 ll f[13][13][1<<13];
     7 int a[13][13];
     8 int n,m,cas;
     9 
    10 int main()
    11 {
    12   scanf("%d",&cas);
    13   for (int tt=1; tt<=cas; tt++)
    14   {
    15     scanf("%d%d",&n,&m);
    16     for (int i=1; i<=n; i++)
    17       for (int j=1; j<=m; j++)
    18         scanf("%d",&a[i][j]);
    19     printf("Case %d: ",tt);
    20     memset(f,0,sizeof(f));
    21     f[0][m][0]=1;
    22     for (int i=1; i<=n; i++)
    23     {
    24       for (int j=0; j<(1<<m); j++)
    25         f[i][0][j<<1]=f[i-1][m][j];
    26       for (int j=1; j<=m; j++)
    27       {
    28         for (int st=0; st<(1<<(m+1)); st++)
    29         {
    30           int x=1<<j,y=1<<(j-1);
    31           if (a[i][j])
    32           {
    33             if ((st&x)&&(st&y)) f[i][j][st]=f[i][j-1][st^x^y];
    34             else if (!(st&x)&&!(st&y)) f[i][j][st]=f[i][j-1][st|x|y];
    35             else f[i][j][st]=f[i][j-1][st]+f[i][j-1][st^x^y];
    36           }
    37           else {
    38             if (!(st&x)&&!(st&y)) f[i][j][st]=f[i][j-1][st];
    39             else f[i][j][st]=0;
    40           }
    41         }
    42       }
    43     }
    44     printf("There are %lld ways to eat the trees.
    ",f[n][m][0]);
    45   }
    46   return 0;
    47 }
    hdu1693

    poj1793(男人八题!)

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 typedef long long ll;
      5 const int mo=30007;
      6 const int maxl=1000010;
      7 using namespace std;
      8 struct node{
      9   int p[mo],nex[maxl],len;
     10   ll st[maxl],f[maxl];
     11   void clr()
     12   {
     13     len=0; memset(p,255,sizeof(p));
     14   }
     15   void push(ll nw,ll s)
     16   {
     17     int x=nw%mo;
     18     for (int i=p[x];i!=-1; i=nex[i])
     19       if (st[i]==nw)
     20       {
     21         f[i]+=s;
     22         return;
     23       }
     24     st[++len]=nw; f[len]=s;
     25     nex[len]=p[x]; p[x]=len;
     26   }
     27 } h[2];
     28 int n,m,cas,p,ex,ey;
     29 int a[15][15],b[15],v[15];
     30 
     31 void get(ll st)
     32 {
     33   for (int i=m; i>=0; i--)
     34   {
     35     b[i]=st&7;
     36     st>>=3;
     37   }
     38 }
     39 
     40 ll put()
     41 {
     42   memset(v,255,sizeof(v)); v[0]=0;
     43   ll st=0; int t=0;
     44   for (int i=0; i<=m; i++)
     45   {
     46     if (v[b[i]]==-1) v[b[i]]=++t;
     47     b[i]=v[b[i]];
     48     st<<=3; st|=b[i];
     49   }
     50   return st;
     51 }
     52 
     53 void shift()
     54 {
     55   for (int i=m;i; i--) b[i]=b[i-1];
     56   b[0]=0;
     57 }
     58 
     59 void work(int j,int k)
     60 {
     61   if (j==m) shift();
     62   h[p].push(put(),h[1-p].f[k]);
     63 }
     64 
     65 void dp(int i,int j)
     66 {
     67   for (int k=1; k<=h[1-p].len; k++)
     68   {
     69     get(h[1-p].st[k]);
     70     if (!a[i][j])
     71     {
     72       b[j]=b[j-1]=0; work(j,k);
     73       continue;
     74     }
     75     int x=b[j],y=b[j-1];
     76     if (x&&y)
     77     {
     78       if ((x==y&&i==ex&&j==ey)||(x!=y))
     79       {
     80         b[j]=b[j-1]=0;
     81         if (x!=y)
     82           for (int r=0; r<=m; r++) if (b[r]==x) b[r]=y;
     83         work(j,k);
     84       }
     85     }
     86     else if ((x&&!y)||(!x&&y))
     87     {
     88       int r=x+y;
     89       if (a[i][j+1]) {b[j]=r; b[j-1]=0; work(j,k);}
     90       if (a[i+1][j]) {b[j-1]=r; b[j]=0; work(j,k);}
     91     }
     92     else if (a[i][j+1]&&a[i+1][j])
     93     {
     94       b[j]=b[j-1]=m+1;
     95       work(j,k);
     96     }
     97   }
     98 }
     99 
    100 int main()
    101 {
    102   char s[12];
    103   scanf("%d%d",&n,&m);
    104   while (n&&m)
    105   {
    106     memset(a,0,sizeof(a));
    107     for (int i=1; i<=n; i++)
    108     {
    109       scanf("%s",s+1);
    110       for (int j=1; j<=m; j++)
    111         if (s[j]=='.') a[i][j]=1;
    112     }
    113     for (int i=1; i<=m; i++)
    114     {
    115       a[n+2][i]=1;
    116       a[n+1][i]=(i>1&&i<m)?0:1;
    117     }
    118     n+=2;  ex=n; ey=m;
    119     h[0].clr();
    120     h[0].push(0,1);  p=0;
    121     for (int i=1; i<=n; i++)
    122       for (int j=1; j<=m; j++)
    123       {
    124         p^=1; h[p].clr();
    125         dp(i,j);
    126       }
    127     ll ans=0;
    128     for (int i=1; i<=h[p].len; i++)
    129       ans+=h[p].f[i];
    130     printf("%lld
    ",ans);
    131     scanf("%d%d",&n,&m);
    132   }
    133   return 0;
    134 }
    poj1793

    fzu1977

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 typedef long long ll;
      5 const int mo=30007;
      6 const int maxl=300010;
      7 using namespace std;
      8 struct node{
      9   int p[mo],nex[maxl],len;
     10   ll st[maxl],f[maxl];
     11   void clr()
     12   {
     13     len=0; memset(p,255,sizeof(p));
     14   }
     15   void push(ll nw,ll s)
     16   {
     17     int x=nw%mo;
     18     for (int i=p[x];i!=-1; i=nex[i])
     19       if (st[i]==nw)
     20       {
     21         f[i]+=s;
     22         return;
     23       }
     24     st[++len]=nw; f[len]=s;
     25     nex[len]=p[x]; p[x]=len;
     26   }
     27 } h[2];
     28 int n,m,cas,p,ex,ey;
     29 int a[15][15],b[15],v[15];
     30 
     31 void get(ll st)
     32 {
     33   b[m+1]=st&1; st>>=1;
     34   for (int i=m; i>=0; i--)
     35   {
     36     b[i]=st&7;
     37     st>>=3;
     38   }
     39 }
     40 
     41 ll put()
     42 {
     43   memset(v,255,sizeof(v)); v[0]=0;
     44   ll st=0; int t=0;
     45   for (int i=0; i<=m; i++)
     46   {
     47     if (v[b[i]]==-1) v[b[i]]=++t;
     48     b[i]=v[b[i]];
     49     st<<=3; st|=b[i];
     50   }
     51   st<<=1; st|=b[m+1];
     52   return st;
     53 }
     54 
     55 void shift()
     56 {
     57   for (int i=m;i; i--) b[i]=b[i-1];
     58   b[0]=0;
     59 }
     60 
     61 void dp(int i,int j)
     62 {
     63   for (int k=1; k<=h[p^1].len; k++)
     64   {
     65     get(h[p^1].st[k]);
     66     if (!a[i][j])
     67     {
     68       b[j]=b[j-1]=0;
     69       h[p].push(put(),h[p^1].f[k]);
     70       continue;
     71     }
     72     int x=b[j],y=b[j-1];
     73     if (b[m+1])
     74     {
     75       if (!x&&!y&&a[i][j]!=1)
     76       {
     77         b[j]=b[j-1]=0;
     78         h[p].push(put(),h[p^1].f[k]);
     79       }
     80       continue;
     81     }
     82     if (x&&y)
     83     {
     84       b[j]=b[j-1]=0;
     85       if (x!=y){
     86         for (int r=0; r<=m; r++) if (b[r]==x) b[r]=y;
     87       }
     88       else b[m+1]=1;
     89       h[p].push(put(),h[p^1].f[k]);
     90     }
     91     else if ((x&&!y)||(!x&&y))
     92     {
     93       int r=x+y;
     94       if (a[i][j+1])
     95       {
     96         b[j]=r; b[j-1]=0;
     97         h[p].push(put(),h[p^1].f[k]);
     98       }
     99       if (a[i+1][j])
    100       {
    101         b[j-1]=r; b[j]=0;
    102         h[p].push(put(),h[p^1].f[k]);
    103       }
    104     }
    105     else {
    106       if (a[i][j+1]&&a[i+1][j])
    107       {
    108         b[j]=b[j-1]=m+1;
    109         h[p].push(put(),h[p^1].f[k]);
    110       }
    111       if (a[i][j]==2)
    112       {
    113         b[j]=b[j-1]=0;
    114         h[p].push(put(),h[p^1].f[k]);
    115       }
    116     }
    117   }
    118 }
    119 
    120 int main()
    121 {
    122   char s[15]; int cas;
    123   scanf("%d",&cas);
    124   for (int tt=1; tt<=cas; tt++)
    125   {
    126     scanf("%d%d",&n,&m);
    127     memset(a,0,sizeof(a));
    128     for (int i=1; i<=n; i++)
    129     {
    130       scanf("%s",s+1);
    131       for (int j=1; j<=m; j++)
    132         if (s[j]=='O') a[i][j]=1;
    133         else if (s[j]=='*') a[i][j]=2;
    134     }
    135     h[0].clr();
    136     h[0].push(0,1);  p=0;
    137     for (int i=1; i<=n; i++)
    138     {
    139       p^=1; h[p].clr();
    140       for (int k=1; k<=h[p^1].len; k++)
    141       {
    142         get(h[p^1].st[k]); shift();
    143         h[p].push(put(),h[p^1].f[k]);
    144       }
    145       for (int j=1; j<=m; j++)
    146       {
    147         p^=1; h[p].clr();
    148         dp(i,j);
    149       }
    150     }
    151     ll ans=0;
    152     for (int i=1; i<=h[p].len; i++)
    153       ans+=h[p].f[i];
    154     printf("Case %d: %I64d
    ",tt,ans);
    155   }
    156   return 0;
    157 }
    fzu1977

    hdu3377

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 typedef long long ll;
      5 const int mo=30007;
      6 const int maxl=1000010;
      7 const int inf=-100000007;
      8 using namespace std;
      9 struct node{
     10   int p[mo],nex[maxl],len,f[maxl];
     11   ll st[maxl];
     12   void clr()
     13   {
     14     len=0; memset(p,255,sizeof(p));
     15   }
     16   void push(ll nw,int s)
     17   {
     18     int x=nw%mo;
     19     for (int i=p[x];i!=-1; i=nex[i])
     20       if (st[i]==nw)
     21       {
     22         f[i]=max(f[i],s);
     23         return;
     24       }
     25     st[++len]=nw; f[len]=s;
     26     nex[len]=p[x]; p[x]=len;
     27   }
     28 } h[2];
     29 int n,m,cas,p,ex,ey;
     30 int a[15][15],b[15],v[15];
     31 
     32 void get(ll st)
     33 {
     34   for (int i=m; i>=0; i--)
     35   {
     36     b[i]=st&7;
     37     st>>=3;
     38   }
     39 }
     40 
     41 ll put()
     42 {
     43   memset(v,255,sizeof(v)); v[0]=0;
     44   ll st=0; int t=0;
     45   for (int i=0; i<=m; i++)
     46   {
     47     if (v[b[i]]==-1) v[b[i]]=++t;
     48     b[i]=v[b[i]];
     49     st<<=3; st|=b[i];
     50   }
     51   return st;
     52 }
     53 
     54 void shift()
     55 {
     56   for (int i=m;i; i--) b[i]=b[i-1];
     57   b[0]=0;
     58 }
     59 
     60 void dp(int i,int j)
     61 {
     62   for (int k=1; k<=h[1-p].len; k++)
     63   {
     64     get(h[1-p].st[k]);
     65     int x=b[j],y=b[j-1];
     66     if (i==1&&j==1)
     67     {
     68       if (i<n) {b[j-1]=m+1; b[j]=0; h[p].push(put(),h[1-p].f[k]+a[i][j]);}
     69       if (j<m) {b[j-1]=0; b[j]=m+1; h[p].push(put(),h[1-p].f[k]+a[i][j]);}
     70       continue;
     71     }
     72     if (i==n&&j==m)
     73     {
     74       if ((!x&&y)||(!y&&x))
     75       {
     76         b[j]=b[j-1]=0;
     77         h[p].push(put(),h[1-p].f[k]+a[i][j]);
     78       }
     79       continue;
     80     }
     81     if (x&&y)
     82     {
     83       if (x!=y)
     84       {
     85         b[j]=b[j-1]=0;
     86         if (x!=y)
     87           for (int r=0; r<=m; r++) if (b[r]==x) b[r]=y;
     88         if (j==m) shift();
     89         h[p].push(put(),h[1-p].f[k]+a[i][j]);
     90       }
     91     }
     92     else if ((x&&!y)||(!x&&y))
     93     {
     94       int r=x+y;
     95       if (j<m) {
     96         b[j]=r; b[j-1]=0;
     97         h[p].push(put(),h[1-p].f[k]+a[i][j]);
     98       }
     99       if (i<n)
    100       {
    101         b[j-1]=r; b[j]=0;
    102         if (j==m) shift();
    103         h[p].push(put(),h[1-p].f[k]+a[i][j]);
    104       }
    105     }
    106     else {
    107       if (i<n&&j<m)
    108       {
    109         b[j]=b[j-1]=m+1;
    110         h[p].push(put(),h[1-p].f[k]+a[i][j]);
    111       }
    112       b[j]=b[j-1]=0;
    113       if (j==m) shift();
    114       h[p].push(put(),h[1-p].f[k]);
    115     }
    116   }
    117 }
    118 
    119 int main()
    120 {
    121   int tt=0;
    122   while (scanf("%d%d",&n,&m)!=EOF)
    123   {
    124     for (int i=1; i<=n; i++)
    125       for (int j=1; j<=m; j++)
    126         scanf("%d",&a[i][j]);
    127     if (n==1&&m==1)
    128     {
    129       printf("Case %d: %d
    ",++tt,a[1][1]);
    130       continue;
    131     }
    132     h[0].clr();
    133     h[0].push(0,0);  p=0;
    134     for (int i=1; i<=n; i++)
    135       for (int j=1; j<=m; j++)
    136       {
    137         p^=1; h[p].clr();
    138         dp(i,j);
    139       }
    140     int ans=inf;
    141     for (int i=1; i<=h[p].len; i++)
    142       ans=max(ans,h[p].f[i]);
    143     printf("Case %d: %d
    ",++tt,ans);
    144   }
    145   return 0;
    146 }
    hdu3377

    poj3133

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 
      5 const int maxl=1100010;
      6 using namespace std;
      7 struct node{
      8   int len,f[maxl],st[maxl];
      9   void clr()
     10   {
     11     for (int i=1; i<=len; i++) f[st[i]]=-1;
     12     len=0;
     13   }
     14   void push(int nw,int s)
     15   {
     16     if (f[nw]==-1)
     17     {
     18       st[++len]=nw;
     19       f[nw]=s;
     20     }
     21     else f[nw]=min(f[nw],s);
     22   }
     23 } h[2];
     24 int n,m,cas,p;
     25 int a[15][15],b[15];
     26 
     27 void get(int st)
     28 {
     29   for (int i=m; i>=0; i--)
     30   {
     31     b[i]=st&3;
     32     st>>=2;
     33   }
     34 }
     35 
     36 int put()
     37 {
     38   int st=0;
     39   for (int i=0; i<=m; i++) {st<<=2; st|=b[i];}
     40   return st;
     41 }
     42 
     43 void shift()
     44 {
     45   for (int i=m;i; i--) b[i]=b[i-1];
     46   b[0]=0;
     47 }
     48 
     49 void dp(int i,int j)
     50 {
     51   for (int k=1; k<=h[1-p].len; k++)
     52   {
     53     get(h[1-p].st[k]);
     54     int x=b[j],y=b[j-1],st=h[1-p].st[k];
     55     if (a[i][j]!=1)
     56     {
     57       if (!a[i][j]&&!x&&!y) h[p].push(st,h[1-p].f[st]);
     58       else if (a[i][j]>1)
     59       {
     60         if (((x&&!y)||(!x&&y))&&(x+y==a[i][j])) {b[j]=b[j-1]=0; h[p].push(put(),h[1-p].f[st]+1);}
     61         else if (!x&&!y)
     62         {
     63           if (a[i][j+1]==a[i][j]||a[i][j+1]==1) {b[j]=a[i][j]; b[j-1]=0; h[p].push(put(),h[1-p].f[st]+1);}
     64           if (a[i+1][j]==a[i][j]||a[i+1][j]==1) {b[j-1]=a[i][j]; b[j]=0; h[p].push(put(),h[1-p].f[st]+1);}
     65         }
     66       }
     67       continue;
     68     }
     69     if (x&&y&&x==y) {b[j]=b[j-1]=0; h[p].push(put(),h[1-p].f[st]+1);}
     70     else if ((x&&!y)||(!x&&y))
     71     {
     72       int r=x+y;
     73       if (a[i][j+1]==1||a[i][j+1]==r) {b[j]=r; b[j-1]=0; h[p].push(put(),h[1-p].f[st]+1);}
     74       if (a[i+1][j]==1||a[i+1][j]==r) {b[j-1]=r; b[j]=0; h[p].push(put(),h[1-p].f[st]+1);}
     75     }
     76     else if (!x&&!y)
     77     {
     78       if (a[i][j+1]&&a[i+1][j])
     79       {
     80         if (a[i][j+1]==1&&a[i+1][j]==1)
     81         {
     82           b[j]=b[j-1]=2;  h[p].push(put(),h[1-p].f[st]+1);
     83           b[j]=b[j-1]=3;  h[p].push(put(),h[1-p].f[st]+1);
     84         }
     85         else if (a[i][j+1]==2&&a[i+1][j]==1||a[i][j+1]==1&&a[i+1][j]==2||a[i+1][j]==2&&a[i][j+1]==2) {b[j]=b[j-1]=2; h[p].push(put(),h[1-p].f[st]+1);}
     86         else if (a[i][j+1]==3&&a[i+1][j]==1||a[i][j+1]==1&&a[i+1][j]==3||a[i+1][j]==3&&a[i][j+1]==3) {b[j]=b[j-1]=3; h[p].push(put(),h[1-p].f[st]+1);}
     87       }
     88       h[p].push(st,h[1-p].f[st]);
     89     }
     90   }
     91 }
     92 
     93 int main()
     94 {
     95   h[1].len=h[0].len=0;
     96   memset(h[0].f,255,sizeof(h[0].f));
     97   memset(h[1].f,255,sizeof(h[1].f));
     98   scanf("%d%d",&n,&m);
     99   while (n&&m)
    100   {
    101     memset(a,0,sizeof(a));
    102     for (int i=1; i<=n; i++)
    103     {
    104       for (int j=1; j<=m; j++)
    105       {
    106         scanf("%d",&a[i][j]);
    107         if (a[i][j]==0||a[i][j]==1) a[i][j]^=1;
    108       }
    109     }
    110     h[0].push(0,0);  p=0;
    111     for (int i=1; i<=n; i++)
    112     {
    113       p^=1;  h[p].clr();
    114       for (int k=1; k<=h[1-p].len; k++)
    115       {
    116         get(h[1-p].st[k]); int st=h[1-p].st[k]; shift();
    117         h[p].push(put(),h[1-p].f[st]);
    118       }
    119       for (int j=1; j<=m; j++)
    120       {
    121         p^=1; h[p].clr();
    122         dp(i,j);
    123       }
    124     }
    125     int ans=0;
    126     for (int i=1; i<=h[p].len; i++)
    127     {
    128       int st=h[p].st[i];
    129       ans+=h[p].f[st];
    130     }
    131     if (ans>0) ans-=2;
    132     printf("%d
    ",ans);
    133     h[1].clr(); h[0].clr();
    134     scanf("%d%d",&n,&m);
    135   }
    136   return 0;
    137 }
    poj3133

    hdu4285

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 typedef long long ll;
      5 const int ha=30007;
      6 const int maxl=300010;
      7 const int mo=1000000007;
      8 using namespace std;
      9 struct node{
     10   int p[ha],nex[maxl],len,f[maxl];
     11   ll st[maxl];
     12   void clr()
     13   {
     14     len=0; memset(p,255,sizeof(p));
     15   }
     16   void push(ll nw,int s)
     17   {
     18     int x=nw%ha;
     19     for (int i=p[x];i!=-1; i=nex[i])
     20       if (st[i]==nw)
     21       {
     22         f[i]=(f[i]+s)%mo;
     23         return;
     24       }
     25     st[++len]=nw; f[len]=s;
     26     nex[len]=p[x]; p[x]=len;
     27   }
     28 } h[2];
     29 int n,m,cas,p,t;
     30 int a[15][15],b[15],v[15];
     31 
     32 void get(ll st)
     33 {
     34   b[m+1]=st&63; st>>=6;
     35   for (int i=m; i>=0; i--)
     36   {
     37     b[i]=st&7;
     38     st>>=3;
     39   }
     40 }
     41 
     42 ll put()
     43 {
     44   memset(v,255,sizeof(v)); v[0]=0;
     45   ll st=0; int t=0;
     46   for (int i=0; i<=m; i++)
     47   {
     48     if (v[b[i]]==-1) v[b[i]]=++t;
     49     b[i]=v[b[i]];
     50     st<<=3; st|=b[i];
     51   }
     52   st<<=6; st|=b[m+1];
     53   return st;
     54 }
     55 
     56 void shift()
     57 {
     58   for (int i=m;i; i--) b[i]=b[i-1];
     59   b[0]=0;
     60 }
     61 
     62 bool check(int j)
     63 {
     64   bool ff=1;
     65   for (int i=0; i<j-1; i++)
     66     if (b[i]) ff^=1;
     67   if (!ff) return 0;
     68   for (int i=j+1; i<=m; i++)
     69     if (b[i]) ff^=1;
     70   return ff;
     71 }
     72 
     73 void dp(int i,int j)
     74 {
     75   for (int k=1; k<=h[p^1].len; k++)
     76   {
     77     get(h[p^1].st[k]);
     78     if (!a[i][j])
     79     {
     80       b[j]=b[j-1]=0;
     81       h[p].push(put(),h[p^1].f[k]);
     82       continue;
     83     }
     84     int x=b[j],y=b[j-1];
     85     if (b[m+1]==t) continue;
     86     if (x&&y)
     87     {
     88       b[j]=b[j-1]=0;
     89       if (x!=y){
     90         for (int r=0; r<=m; r++) if (b[r]==x) b[r]=y;
     91       }
     92       else {
     93         if (check(j)) ++b[m+1]; else continue;
     94       }
     95       h[p].push(put(),h[p^1].f[k]);
     96     }
     97     else if ((x&&!y)||(!x&&y))
     98     {
     99       int r=x+y;
    100       if (a[i][j+1])
    101       {
    102         b[j]=r; b[j-1]=0;
    103         h[p].push(put(),h[p^1].f[k]);
    104       }
    105       if (a[i+1][j])
    106       {
    107         b[j-1]=r; b[j]=0;
    108         h[p].push(put(),h[p^1].f[k]);
    109       }
    110     }
    111     else {
    112       if (a[i][j+1]&&a[i+1][j])
    113       {
    114         b[j]=b[j-1]=m+1;
    115         h[p].push(put(),h[p^1].f[k]);
    116       }
    117     }
    118   }
    119 }
    120 
    121 int main()
    122 {
    123   char s[15]; int cas;
    124   scanf("%d",&cas);
    125   while (cas--)
    126   {
    127     scanf("%d%d%d",&n,&m,&t);
    128     memset(a,0,sizeof(a));
    129     for (int i=1; i<=n; i++)
    130     {
    131       scanf("%s",s+1);
    132       for (int j=1; j<=m; j++)
    133         if (s[j]=='.') a[i][j]=1;
    134     }
    135     h[0].clr();
    136     h[0].push(0,1);  p=0;
    137     for (int i=1; i<=n; i++)
    138     {
    139       p^=1; h[p].clr();
    140       for (int k=1; k<=h[p^1].len; k++)
    141       {
    142         get(h[p^1].st[k]); shift();
    143         h[p].push(put(),h[p^1].f[k]);
    144       }
    145       for (int j=1; j<=m; j++)
    146       {
    147         p^=1; h[p].clr();
    148         dp(i,j);
    149       }
    150     }
    151     int ans=0;
    152     for (int i=1; i<=h[p].len; i++)
    153     {
    154       get(h[p].st[i]);
    155       if (b[m+1]==t) ans=(ans+h[p].f[i])%mo;
    156     }
    157     printf("%d
    ",ans);
    158   }
    159   return 0;
    160 }
    hdu4285

    矩阵乘法加速插头dp的几题一直想做,抽时间要补一下

  • 相关阅读:
    IE6下div遮盖select的最优解决方案
    jQuery一些常用特效方法使用实例
    你用什么工具开发JavaScript?
    抛弃jQuery 深入原生的JavaScript
    在JavaScript中实现yield,实用简洁实现方式。
    jquery复选框checkbox实现删除
    一系列JavaScript的基础工具
    jQuery一些常用特效方法使用实例
    JavaScript 文件上传类型判断
    Java大文件分片上传/多线程上传功能
  • 原文地址:https://www.cnblogs.com/phile/p/6123980.html
Copyright © 2011-2022 走看看