POJ 3254 Corn Fields [DP]
2013-08-19 16:22
211 查看
题意:略。
思路:第一次做状态压缩的dp。
在这里说一下状态压缩的原则。因为每一行只有最多12个格子,每个格子只有1(可放牛)和0(不可放牛)两种状态,这总共是2^12种状态,直接用一个int整型变量从0枚举到2^12 - 1。对于每一个数,将其转换成二进制,先判断格子为0时该数二进制对应位上是不是1,若是则该状态不可行。其次再判断该数相邻的两位有没有同时为1的情况,如果有,该状态也不可行。
递推公式就是:dp[i][k] = dp[j][k-1]。
其中dp[i][k]表示在牧场第k行状态为i时可行解的数量。它等于上一层所有可行状态的可行解数量之和。
在dp过程中,在判断该层的上一层某状态是否可行时,需要判断两层状态有没有上下相邻的位同为1的情况,如果有,则上一层的状态不可行,跳过。
此外在计算可行解数量和时别忘了取模。
思路:第一次做状态压缩的dp。
在这里说一下状态压缩的原则。因为每一行只有最多12个格子,每个格子只有1(可放牛)和0(不可放牛)两种状态,这总共是2^12种状态,直接用一个int整型变量从0枚举到2^12 - 1。对于每一个数,将其转换成二进制,先判断格子为0时该数二进制对应位上是不是1,若是则该状态不可行。其次再判断该数相邻的两位有没有同时为1的情况,如果有,该状态也不可行。
递推公式就是:dp[i][k] = dp[j][k-1]。
其中dp[i][k]表示在牧场第k行状态为i时可行解的数量。它等于上一层所有可行状态的可行解数量之和。
在dp过程中,在判断该层的上一层某状态是否可行时,需要判断两层状态有没有上下相邻的位同为1的情况,如果有,则上一层的状态不可行,跳过。
此外在计算可行解数量和时别忘了取模。
#include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> #define pri 100000000 using namespace std; int m, n; int farm[15][15]; int dp[1<<13][15]; bool judge(int i,int pos)//判断状态i在牧场第pos行是否合法 { int now = n; int last = 0; while (now) { int num = i % 2; if (!farm[pos][now] && num || (last && num)) return 0; last = num; i /= 2; now--; } return 1; } bool judge_state(int i,int j)//判断状态i和j能否放在牧场上下相邻的两行 { int now = n; while (now) { if ((i % 2) && (j % 2)) return 0; i /= 2; j /= 2; now--; } return 1; } int getdp() { memset(dp, 0, sizeof(dp)); for (int i = 0; i < (1<<n); i++)//初始化第一行 if (judge(i, 1)) dp[i][1] = 1; for (int i = 2; i <= m; i++)//枚举牧场剩下的每一行 for (int j = 0; j < (1<<n); j++) if (judge(j, i))//枚举该行可行的状态 for (int k = 0; k < (1<<n); k++) if (dp[k][i-1])//枚举上一行可行的状态 if (judge_state(j, k)) { dp[j][i] += dp[k][i-1]; dp[j][i] %= pri; } int res = 0; for (int i = 0; i < (1<<n); i++) { res += dp[i][m]; res %= pri; } return res; } int main() { scanf("%d%d", &m, &n); for (int i = 1; i <= m; i++) for (int j = 1; j <= n; j++) scanf("%d", &farm[i][j]); printf("%d", getdp()); return 0; }
相关文章推荐
- poj 3254 Corn Fields(动态规划:状压DP)
- POJ 3254 Corn Fields(状态压缩DP)
- poj 3254 Corn Fields (状态压缩dp)
- poj3254 状态压缩dp-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 (状态压缩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
- POJ 3254 Corn Fields (状态压缩DP)