Corn Fields 状压动归入门题

#include<cstdio>
using namespace std;
const int N=15;
int dp[N][1<<N],v[1<<N],M[N][N];
int n,m,cnt;
const int mod=100000000;
void init()
{
    for(int i=0;i<(1<<m);++i)
        if((i&(i<<1))==0)v[++cnt]=i;
}
int ok(int dep,int cur){
    for(int i=1;i<=m;++i)
        if((cur&(1<<(i-1)))&&!M[dep][m-i+1])return 0;     
    return 1;
}
int main(){
    //freopen("in.txt","r",stdin);
    scanf("%d%d",&n,&m);
    init();
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)scanf("%d",&M[i][j]);

    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=cnt;++j)
        {
            if(!ok(i,v[j]))continue;
            if(i==1){
                dp[i][j]=1;continue;
            }
            for(int k=1;k<=cnt;++k)
                if((v[k]&v[j])==0){
                    dp[i][j]=(dp[i][j]+dp[i-1][k])%mod;
                }
        }
    }
    int ans=0;
    for(int i=1;i<=cnt;++i)
        ans=(ans+dp[n][i])%mod;
    printf("%d",ans);
    return 0;
}
posted @ 2018-08-24 19:12  EM-LGH  阅读(131)  评论(0编辑  收藏  举报