[題解](狀壓/水)luogu_P1879玉米田

Posted superminivan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[題解](狀壓/水)luogu_P1879玉米田相关的知识,希望对你有一定的参考价值。

大水題然而因為智障的錯誤调了半天......
n,m别反着输入啊......內外循環和狀態數都不等價

别的就是記錄一下每一行不可行的點,也狀壓一下,dp的時候判一下即可

#include<bits/stdc++.h>
using namespace std;
const int mod=100000000;
int n,m,tot;
int f[15][1<<12+1],c[1<<12+1];
int can[15];
int main()
{
    scanf("%d%d",&m,&n);
    for(int i=1,a;i<=m;i++)
    for(int j=1;j<=n;j++){
        scanf("%d",&a);
        if(a==0)can[i]=can[i]|(1<<(n-j));
    }
    for(int i=0;i<=(1<<n)-1;i++)
    if(!(i&(i<<1)) && !(i&(i>>1)))c[++tot]=i;
    int last,now;
    for(int i=1;i<=tot;i++){//處理第一行 
        if(c[i] & can[1])continue;
        f[1][c[i]]=1;
    }
    for(int i=2;i<=m;i++)
    for(int j=1;j<=tot;j++){
        last=c[j];if(last & can[i-1])continue;
        for(int k=1;k<=tot;k++){
            now=c[k];
            if(now & can[i])continue;
            if(now & last)continue;
            f[i][now]+=f[i-1][last];
            f[i][now]%=mod;
        }    
    }
    int ans=0;
    for(int i=0;i<=(1<<n)-1;i++){
        ans+=f[m][i];ans%=mod;
    }
    printf("%d",(ans+mod)%mod);
//    for(int i=1;i<=tot;i++)cout<<c[i]<<‘ ‘;
}

 

以上是关于[題解](狀壓/水)luogu_P1879玉米田的主要内容,如果未能解决你的问题,请参考以下文章

[題解](最小生成樹)luogu_P2916安慰奶牛

[題解](二分答案/單調隊列)luogu_P1419尋找段落

[題解]luogu_P1144最短路計數

[題解](單調隊列dp)luogu_P1725琪露諾

[題解](貪心/堆)luogu_P2107小Z的AK計劃

洛谷 P1879 [USACO06NOV]玉米田Corn Fields