P1879 [USACO06NOV] Corn Fields G

/*
n*m的 0、1图 只有 1 可以种草 每个草 不相邻(没有哪两块草地有公共边) 问有多少种方法分配
状态dp
f[i][p]:第i行 状态位p 的方案数
f[i][p]=f[i][p]+f[i-1][k] 

*/
/*

*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<queue>
#include<vector>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------------\n");
using namespace std;
const int maxn=1e1 +10;
const int mod=1e8;
const int inf=0x3f3f3f3f;

ll n,m,mp[20],g[1<<15+10];
ll f[20][(1<<15)+10],ans;

int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            int tmp;cin>>tmp;
            mp[i]<<=1,mp[i]+=tmp;
        }
    }
   // for(int i=1;i<=n;i++) cout<<mp[i]<<endl;
    
    for(int i=0;i<(1<<m);i++){
        if((i&(i<<1))==0 && (i&(i>>1))==0)
        {
            g[i]=1;
            if((mp[1]&i)==i) f[1][i]=1;
        }
    }
    
    for(int i=2;i<=n;i++)
    {
        for(int j=0;j<(1<<m);j++)
        {
            if(g[j]&& (j&mp[i])==j)
            {
                for(int k=0;k<(1<<m);k++)
                {
                    if(g[k]&& (k&mp[i-1])==k  && (j&k)==0 )
                    {
                        f[i][j]=(f[i][j]+f[i-1][k])%mod;
                    }
                }
            }
        }
    }
    
    for(int i=0;i<(1<<m);i++)
        ans=(ans+f[n][i])%mod;
    
    cout<<ans<<'\n';
    
    return 0;
}

 

posted @ 2023-11-15 05:11  JMXZ  阅读(7)  评论(0)    收藏  举报