题意简述
给定一个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
", ans);
}