15145641

一道状态压缩的题,错了好多次....应该先把满足的情况预处理出来

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int fitnum,n,m;
int maps[20],state[1<<12];
int dp[20][1<<12];
#define mod 1000000000
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        memset(maps,0,sizeof(maps));
        fitnum = 0;
        for(int i = 1;i <= n;i++)
        {
            for(int j = 1;j <= m;j++)
            {
                int s;
                scanf("%d",&s);
                if(!s)
                maps[i] += 1<<(m-j);
            }
        }
        memset(dp,0,sizeof(dp));
        memset(state,0,sizeof(state));
        for(int i = 0;i < (1<<m);i++)
        {
            if((i&(i<<1)) == 0)
            state[fitnum++] = i;
        }
        for(int i = 0;i < fitnum;i++)
        {
            if(!(state[i] & maps[1]))
                dp[1][i] = 1;
        }
        for(int i = 2;i <= n;i++)
        {
            for(int k = 0;k < fitnum;k++)
            {
                if(state[k] & maps[i]) continue;
                for(int j = 0;j < fitnum;j++)
                {
                    if(state[j] & maps[i-1]) continue;
                    if(state[j] & state[k]) continue;
                    dp[i][k] = (dp[i][k]%mod + dp[i-1][j]%mod)%mod;
                }
            }
        }
        int ans = 0;
        for(int i = 0;i < fitnum;i++)
        {
            ans = (ans%mod + dp[n][i]%mod) % mod;
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

posted on 2016-04-30 20:19  icode-xiaohu  阅读(217)  评论(0编辑  收藏  举报