题意:略。

思路:第一次做状态压缩的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的情况,如果有,则上一层的状态不可行,跳过。

此外在计算可行解数量和时别忘了取模。

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<string.h>
 4 #include<algorithm>
 5 #define pri 100000000
 6 using namespace std;
 7 int m, n;
 8 int farm[15][15];
 9 int dp[1<<13][15];
10 bool judge(int i,int pos)//判断状态i在牧场第pos行是否合法
11 {
12     int now = n;
13     int last = 0;
14     while (now)
15     {
16         int num = i % 2;
17         if (!farm[pos][now] && num || (last && num)) return 0;
18         last = num;
19         i /= 2;
20         now--;
21     }
22     return 1;
23 }
24 bool judge_state(int i,int j)//判断状态i和j能否放在牧场上下相邻的两行
25 {
26     int now = n;
27     while (now)
28     {
29         if ((i % 2) && (j % 2)) return 0;
30         i /= 2;
31         j /= 2;
32         now--;
33     }
34     return 1;
35 }
36 int getdp()
37 {
38     memset(dp, 0, sizeof(dp));
39     for (int i = 0; i < (1<<n); i++)//初始化第一行
40         if (judge(i, 1)) dp[i][1] = 1;
41     for (int i = 2; i <= m; i++)//枚举牧场剩下的每一行
42         for (int j = 0; j < (1<<n); j++) if (judge(j, i))//枚举该行可行的状态
43             for (int k = 0; k < (1<<n); k++) if (dp[k][i-1])//枚举上一行可行的状态
44                 if (judge_state(j, k))
45                 {
46                     dp[j][i] += dp[k][i-1];
47                     dp[j][i] %= pri;
48                 }
49     int res = 0;
50     for (int i = 0; i < (1<<n); i++)
51     {
52         res += dp[i][m];
53         res %= pri;
54     }
55     return res;
56
57 }
58 int main()
59 {
60     scanf("%d%d", &m, &n);
61     for (int i = 1; i <= m; i++)
62         for (int j = 1; j <= n; j++)
63             scanf("%d", &farm[i][j]);
64     printf("%d", getdp());
65     return 0;
66 }

转载于:https://www.cnblogs.com/fenshen371/p/3268122.html

POJ 3254 Corn Fields [DP]相关推荐

  1. poj 3254 Corn Fields 状态压缩dp

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K       Description Farmer John has purchased a ...

  2. 状态压缩dp入门 第一题 POJ 3254 Corn Fields

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6460   Accepted: 3436 Descr ...

  3. POJ - 3254 - Corn Fields

    线上题目: Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6936   Accepted: 3697 ...

  4. poj 3254 Corn Fields (状态压缩DP)

    题目:http://poj.org/problem?id=3254 思路见代码: #include<iostream> using namespace std;const int MOD= ...

  5. poj - 3254 Corn Fields (状态压缩dp入门)

    http://poj.org/problem?id=3254 参考:http://blog.csdn.net/accry/article/details/6607703 农夫想在m*n的土地上种玉米, ...

  6. Poj - 3254 Corn Fields (状压DP)(入门)

    题目链接:https://vjudge.net/contest/224636#problem/G 转载于:https://blog.csdn.net/harrypoirot/article/detai ...

  7. POJ - 3254 Corn Fields(状压dp)

    题目链接:点击查看 题目大意:给出一个n*m的地图,有些位置不能放牧,然后放牧的条件是相邻两个格子不允许同时使用,问可行方案有几种 题目分析:因为给出的数据范围很小,并且放牧的状态是放或者不放,很容易 ...

  8. POJ 3254 Corn Fields(状态压缩)

    题意:给你一个n*m的田地,每块田地可以种菜,0代表不能种,1可以,求有多少种方法 题解:炮兵布阵系列 #include<cstdio> #include<cstring> # ...

  9. POJ 3254 Corn Fields (状态压缩)

    刚开始的思路是  把0-2^x的 所有状态枚举, 然后找符合条件的,   但是 发现 当12*12 时  1的数量x 超过64  这是个庞大的数字, 跟本就没法枚举: 想到用状态压缩,  但是 怎么压 ...

最新文章

  1. mysql 多表既有内连接又有外连接_MySQL 多表查询中的内连接和外连接
  2. Android中No resource found that matches android:TextAppearance.Material.Widget.Button.Inverse问题
  3. 一种比sys.path更好的获得当前脚本路径的方法
  4. 【渝粤教育】国家开放大学2018年春季 0077-21T古代汉语专题 参考试题
  5. android r 编译找不到头文件_「投稿」iOS逆向——砸壳与反编译
  6. 【SQL Sever】将SQL Sever中的一个数据表的数据导出为insert语句
  7. java面向对象的教程_java面向对象入门教程
  8. python多进程间通信_Python 多进程编程之 进程间的通信(Queue)
  9. Linux下使用脚本安装和升级pip
  10. GEE 导入shp数据-裁剪影像
  11. 传感器检测技术——概论
  12. 三阶齐次线性方程求通解_齐次线性方程组通解求法的数学原理
  13. 支付宝支付接口开通流程
  14. 视频录制——SurfaceView + MediaRecorder 实现视频录制功能
  15. javascript 学习
  16. 福建2021高考成绩查询是什么时间,2021年福建高考成绩排名及成绩公布时间什么时候出来...
  17. Java面试题大全(Android版)
  18. [AV1] interpolation
  19. php干啥,php是什么意思?php能干啥?
  20. GeoScene Pro 2.1下载地址与安装基本要求

热门文章

  1. 阿里DNS:用LibFuzzer照亮DNS代码的死角
  2. Laravel中自定义guard,自定义Auth的attempt方法
  3. lt;转gt;Java转iOS-第一个项目总结(2):遇到问题和解决方案
  4. 删除顽固文件的执行代码,删除rhsa属性文件,删除服务器中黑客留下...
  5. 杭电 Let's go to play
  6. python 学习笔记(6)-转载
  7. lenovo X230热键功能
  8. c++课后题(2) 数组排序
  9. python输入名字配对情侣网名_输入姓名配对qq网名,QQ情侣昵称
  10. Python编写学生类计算年龄、成绩等级