POJ3254 Corn Fields

第一道状态压缩DP。。。。入门题 按照自己的思路来 AC了

先把每行可行的状态求出来 再进行DP


#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int mod=100000000;
int dp[13][5000], map[13][13], state[13][1005], len[13];
int main()
{
    int n, m, i, j, k;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=0;i<n;i++)
            for(j=0;j<m;j++)
                scanf("%d",&map[i][j]);
        for(i=0;i<n;i++)
            len[i]=1, state[i][0]=0;
        int tmp;
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                tmp=len[i];
                for(k=0;k<len[i];k++)
                {
                    if((j==0||!(1<<(j-1)&state[i][k]))&&map[i][j])
                    {
                        state[i][tmp++]=state[i][k]|(1<<j);
                    }
                }
                len[i]=tmp;
            }
        }
        memset(dp,0,sizeof(dp));
        int s1, s2;
        for(i=0;i<len[0];i++)
        {
            dp[0][state[0][i]]=1;
        }
        for(i=1;i<n;i++)
        {
            for(j=0;j<len[i];j++)
            {
                s1=state[i][j];
                for(k=0;k<len[i-1];k++)
                {
                    s2=state[i-1][k];
                    if(!(s1&s2))
                    {
                        dp[i][s1]=(dp[i][s1]+dp[i-1][s2])%mod;
                    }
                }
            }
        }
        int ans=0;
        for(i=0;i<len[n-1];i++)
        {
            s1=state[n-1][i];
            ans=(ans+dp[n-1][s1])%mod;
        }
        printf("%d\n",ans);
    }
    return 0;
}



posted @ 2013-08-27 11:56  Ink_syk  阅读(110)  评论(0编辑  收藏  举报