洛谷 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
", ans);
}
原文地址:https://www.cnblogs.com/xuyixuan/p/9580580.html