洛谷 P1879 [USACO06NOV]玉米田Corn Fields

题意

给定一个n * m的01表格,0表示不能种草,1表示可以种,
而且每块草都不相邻,求共有多少种草的方案。

题解

状压DP

代码

#include <cstdio>
#include <algorithm>
#define REG(a, x, y) for (register int a = x; a <= y; ++a)
using namespace std;
const int Mod = 1e9;
int n, m, x, N, ans;
int map[15], dp[15][5000];
int main()
{
    scanf("%d%d", &m, &n);
    REG(i, 1, m)
        REG(j, 1, n)
        {
            scanf("%d", &x);
            (map[i] <<= 1) |= x;
        }
    N = (1 << n) - 1;
    REG(i, 0, N)
        if (!(i & (i << 1)) && !(i & (i >> 1)) && (i & map[1]) == i)
            dp[1][i] = 1;
    REG(i, 2, m)
        REG(j, 0, N)
            if (!(j & (j << 1)) && !(j & (j >> 1)) && (j & map[i]) == j)
                REG(k, 0, N)
                    if (!(j & k))
                        (dp[i][j] += dp[i - 1][k]) %= Mod;
    REG(i, 0, N) (ans += dp[m][i]) %= Mod;
    printf("%d\n", ans);
}

猜你喜欢

转载自www.cnblogs.com/xuyixuan/p/9580580.html
今日推荐