poj 3254 Corn Fields 状压dp

简单的状压dp,用的是按格递推的方式,这样写要比较简单高效一些。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=13,mod=100000000;
int dp[2][8200];

inline void add(int &a,int &b)
{
    a+=b;
    a%=mod;
}
int main()
{
//    freopen("in.txt","r",stdin);
    int n,m;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        int now=1,to=0;
        dp[0][0]=1;
        for(int i=1,tmp,key;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            now=now^1,to=to^1;
            memset(dp[to],0,sizeof(dp[to]));
            scanf("%d",&tmp);
            for(int k=0;k<(1<<m+1);k++)
            {
                key=k;
                if(key&1) key-=1;
                if(key&(1<<j)) key-=(1<<j);
                add(dp[to][key],dp[now][k]);

                if(tmp==1)
                if((k&(1<<j))==0)
                if((k&1)==0)
                {
                    key=k|1|(1<<j);
                    if(j==m)
                    key-=1;
                    add(dp[to][key],dp[now][k]);
                }
            }
        }
        int ans=0;
        for(int i=0;i<(1<<m+1);i++)
        add(ans,dp[to][i]);
        cout<<ans<<endl;
    }
    return 0;
}


你可能感兴趣的:(poj 3254 Corn Fields 状压dp)