BZOJ-1725: [Usaco2006 Nov]Corn Fields牧场的安排

[文章目录]

Description

Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地。FJ打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用。遗憾的是,有些土地相当的贫瘠,不能用来放牧。并且,奶牛们喜欢独占一块草地的感觉,于是FJ不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边。当然,FJ还没有决定在哪些土地上种草。 作为一个好奇的农场主,FJ想知道,如果不考虑草地的总块数,那么,一共有多少种种植方案可供他选择。当然,把新的牧场荒废,不在任何土地上种草,也算一种方案。请你帮FJ算一下这个总方案数。

都有点不太会状压DP了。。。练手

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m,col[30],sit[1000],tot,ans;
int dp[20][1<<14];
const int mod=100000000;
int main()
{
    scanf("%d%d",&n,&m);
    int x,i,j,s;
    for(s=0;s<(1<<m);++s)
        if(!(s&(s>>1))) sit[++tot]=s;
    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
        {
            scanf("%d",&x);
            col[i]|=(x<<j-1);
        }
    dp[0][1]=1;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=tot;j++)
            if((sit[j]|col[i])==col[i])
            {
                for(s=1;s<=tot;s++)
                    if(!(sit[j]&sit[s]))
                        dp[i][j]=(dp[i][j]+dp[i-1][s])%mod;
            }
    }
    for(i=1;i<=tot;++i) ans=(ans+dp[n][i])%mod;
    printf("%d",ans);
    return 0;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注