poj3254 Corn Fields

来源:互联网 发布:开淘宝网店注册收费 编辑:程序博客网 时间:2024/06/03 00:15

poj3254

分析

这道题算是状态压缩dp的入门题吧,知道状态压缩是个什么套路。

题目

http://poj.org/problem?id=3254

代码

#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int mod=100000000;int n,m,top=0;int state[600],num[110];int dp[20][600];int cur[20];bool ok(int x){    if(x&x<<1)        return 0;    return 1;}void init(){    top=0;    int total=1<<n;    for(int i=0;i<total;i++)    {        if(ok(i))            state[++top]=i;    }}bool fit(int x,int k){    if(x&cur[k]) return 0;    return 1;}int main(){    while(scanf("%d %d",&m,&n)!=EOF)    {        init();        memset(dp,0,sizeof(dp));        for(int i=1;i<=m;i++)        {            cur[i]=0;            int num;            for(int j=1;j<=n;j++)            {                scanf("%d",&num);                if(num==0)                    cur[i]+=(1<<(n-j));            }        }        for(int i=1;i<=top;i++)        {            if(fit(state[i],1))                dp[1][i]=1;        }        for(int i=2;i<=m;i++)        {            for(int k=1;k<=top;k++)            {                if(!fit(state[k],i))                    continue;                for(int j=1;j<=top;j++)                {                    if(!fit(state[j],i-1))                        continue;                    if(state[k]&state[j])                        continue;                    dp[i][k]=(dp[i][k]+dp[i-1][j])%mod;                }            }        }        int ans=0;        for(int i=1;i<=top;i++)            ans=(ans+dp[m][i])%mod;        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击