洛谷 P1879 玉米田Corn Fields 题解

题面

一道思维难度不大的状态压缩,也并不卡常,但细节处理要格外注意;

f[i][j]表示前i行最后一行状态是j的方案数

#include <bits/stdc++.h>
#define p 100000000
using namespace std;
int n,m;
int a[20][20];
int shu[20];
long long f[15][5010];
int main()
{
    cin>>n>>m;
    for(register int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
        }
    }
    for(register int i=1;i<=n;i++){
        long long tmp=0;
        for(int j=1;j<=m;j++){
            tmp=tmp*2;
            tmp+=a[i][j];
        }
        shu[i]=tmp;
    }
    int tot=(1<<m)-1;
    f[0][0]=1;
    for(register int i=1;i<=n;i++){
        long long sum=0;
        for(register int j=0;j<=tot;j++){
            if((j&shu[i])!=j) continue;
            if((j&(j<<1))||(j&(j>>1))) continue;
            for(register int k=0;k<=tot;k++){
                if((k&j)==0)
                f[i][j]=(f[i][j]+f[i-1][k])%p;            
            }
        }
    }
    long long ans=0;
    for(int i=0;i<=tot;i++){
        ans=(ans+f[n][i])%p;
    }
    cout<<ans;
}

 

posted @ 2019-08-26 15:48  神之右大臣  阅读(183)  评论(0编辑  收藏  举报