POJ 3254 Corn Fields
2018-04-27 22:00
260 查看
思路
状压dp,dp[i][j]:表示到第i行,状态为j的方案数。预处理出每一行所有的可能的选法。
转移方程:dp[i][j] += d[i-1][k],j与k不冲突。
代码
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<cmath> using namespace std; const int mod = 1e9; int a[15][15],sta[15][10010],dp[15][10010]; int n,m; inline int read() { int x = 0,f = 1;char ch = getchar(); for (; !isdigit(ch); ch=getchar()) if(ch=='-') f=-1; for (; isdigit(ch); ch=getchar()) x = x*10+ch-'0'; return x * f; } void getsta() { int t = (1 << m) - 1;bool flag; for (int i=1; i<=n; ++i) { for (int j=0; j<=t; ++j) { flag = true; for (int k=0; k<m; ++k) if (!a[i][m-k] && ((1<<k)&j)) {flag = false;break;} if (!flag) continue; if (j & (j<<1)) continue; sta[i][++sta[i][0]] = j; } } } void getdp() { for (int i=1; i<=sta[1][0]; ++i) dp[1][i] = 1; //dp[1][i] not dp[1][sta[1][i]] for (int i=2; i<=n; ++i) for (int j=1; j<=sta[i][0]; ++j) for (int k=1; k<=sta[i-1][0]; ++k) { if (sta[i][j] & sta[i-1][k]) continue; dp[i][j] += dp[i-1][k]; if (dp[i][j] > mod) dp[i][j] %= mod; } int ans = 0; for (int i=1; i<=sta [0]; ++i) { ans += dp [i]; if (ans > 0) ans %= mod; } cout << ans; } int main() { n = read(),m = read(); for (int i=1; i<=n; ++i) for (int j=1; j<=m; ++j) a[i][j] = read(); getsta(); getdp(); return 0; }
http://poj.org/problem?id=3254
相关文章推荐
- poj 3254 Corn Fields
- poj-3254-Corn Fields
- poj3254 Corn Fields
- 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【状态压缩】
- POJ 3254 Corn Fields 状态压缩dp 查找情况数
- Poj - 3254 Corn Fields (状态压缩dp入门第一题(详解
- POJ 3254 Corn Fields (状态压缩DP)
- POJ 3254 Corn Fields 状压DP
- poj 3254 Corn Fields
- POJ 3254 Corn Fields (状态压缩DP)
- POJ 3254 - Corn Fields (状压DP)
- POJ 3254 Corn Fields (状态压缩DP)
- POJ 3254 Corn Fields(状压dp)