POJ 3254 Corn Fields 状态压缩DP
2014-04-25 20:18
531 查看
题目链接:POJ 3254
分析:设行数为n,列数为m。可把dp数组设为dp[i][j],表示为第i行,状态为j时可行数,先预处理出所有可行状态、可兼容状态对(可兼容的含义为:两个状态作为相邻的两行时,两行间的1不跨行相邻),并用tot[i]表示每行有i个元素时的可行状态数(假设每行全为1),dp方程为dp[i][j] = sum( dp[i-1][k] ) k = 0... tot[m] 其中状态j在第i行可行,状态k在第i-1行可行,且状态j和状态k可兼容。
sum(dp[n-1][j]) j = 0...tot[m] 即为所求。
代码如下:
分析:设行数为n,列数为m。可把dp数组设为dp[i][j],表示为第i行,状态为j时可行数,先预处理出所有可行状态、可兼容状态对(可兼容的含义为:两个状态作为相邻的两行时,两行间的1不跨行相邻),并用tot[i]表示每行有i个元素时的可行状态数(假设每行全为1),dp方程为dp[i][j] = sum( dp[i-1][k] ) k = 0... tot[m] 其中状态j在第i行可行,状态k在第i-1行可行,且状态j和状态k可兼容。
sum(dp[n-1][j]) j = 0...tot[m] 即为所求。
代码如下:
#include <cstdio> #include <cstring> const int N = 12, M = 12, mod = 100000000; int dp [1<<M], mat [M], sta[M+1][555], tot[M+1], a ; bool ad[M+1][555][555]; int main() { // freopen("in", "r", stdin); for(int m = 1; m <= 12; ++m) { for(int i = 0; i < 1 << m; ++i) { if(!(i & i << 1)) sta[m][tot[m]++] = i; } for(int i = 0; i < tot[m]; ++i) { for(int j = 0; j < tot[m]; ++j) { ad[m][i][j] = !(sta[m][i] & sta[m][j]); } } } int n, m; while(~scanf("%d%d", &n, &m)) { memset(a, 0, sizeof a); for(int i = 0; i < n; ++i) { for(int j = 0; j < m; ++j) { scanf("%d", mat[i] + j); a[i] |= !mat[i][j] << j; } } memset(dp, 0, sizeof dp); for(int i = 0; i < tot[m]; ++i) { if(!(a[0] & sta[m][i])) dp[0][sta[m][i]] = 1; } for(int i = 1; i < n; ++i) { for(int j = 0; j < tot[m]; ++j) { if(!(a[i] & sta[m][j])) for(int k = 0; k < tot[m]; ++k) { if(ad[m][j][k] && !(a[i-1] & sta[m][k])) dp[i][sta[m][j]] = (dp[i][sta[m][j]] + dp[i-1][sta[m][k]]) % mod; } } } int ans = 0; for(int i = 0; i < tot[m]; ++i) ans = (ans + dp[n-1][sta[m][i]]) % mod; printf("%d\n", ans); } return 0; }
相关文章推荐
- POJ 3254 Corn Fields 状态压缩DP
- poj 3254 Corn Fields(状态压缩dp)
- 状态压缩DP-Corn Fields(POJ 3254)
- POJ 3254 Corn Fields(DP + 状态压缩)
- poj 3254 Corn Fields_状态压缩dp
- POJ —— 3254 Corn Fields(状态压缩dp)
- POJ 3254 Corn Fields(状态压缩DP)
- POJ 3254 Corn Fields(状态压缩DP)
- poj 3254 Corn Fields_状态压缩dp
- poj 3254 Corn Fields(状态压缩dp)
- poj 3254 Corn Fields(状态压缩dp)
- POJ3254——Corn Fields(状态压缩DP)
- POJ 3254 Corn Fields(状态压缩DP)
- POJ 3254 Corn Fields(状态压缩) DP入门
- POJ 3254 Corn Fields(状态压缩dp)
- POJ 3254 Corn Fields 状态压缩dp
- Poj - 3254 Corn Fields (状态压缩dp入门第一题(详解
- POJ 3254 Corn Fields(简单的状态压缩dp)
- poj3254 Corn Fields (状态压缩dp)
- poj 3254 Corn Fields【状态压缩dp】【入门第一题~~】