POJ 3254 Corn Fields [DP]
题意:略。
思路:第一次做状态压缩的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[][];
int dp[<<][];
bool judge(int i,int pos)//判断状态i在牧场第pos行是否合法
{
int now = n;
int last = ;
while (now)
{
int num = i % ;
if (!farm[pos][now] && num || (last && num)) return ;
last = num;
i /= ;
now--;
}
return ;
}
bool judge_state(int i,int j)//判断状态i和j能否放在牧场上下相邻的两行
{
int now = n;
while (now)
{
if ((i % ) && (j % )) return ;
i /= ;
j /= ;
now--;
}
return ;
}
int getdp()
{
memset(dp, , sizeof(dp));
for (int i = ; i < (<<n); i++)//初始化第一行
if (judge(i, )) dp[i][] = ;
for (int i = ; i <= m; i++)//枚举牧场剩下的每一行
for (int j = ; j < (<<n); j++) if (judge(j, i))//枚举该行可行的状态
for (int k = ; k < (<<n); k++) if (dp[k][i-])//枚举上一行可行的状态
if (judge_state(j, k))
{
dp[j][i] += dp[k][i-];
dp[j][i] %= pri;
}
int res = ;
for (int i = ; i < (<<n); i++)
{
res += dp[i][m];
res %= pri;
}
return res; }
int main()
{
scanf("%d%d", &m, &n);
for (int i = ; i <= m; i++)
for (int j = ; j <= n; j++)
scanf("%d", &farm[i][j]);
printf("%d", getdp());
return ;
}
POJ 3254 Corn Fields [DP]的更多相关文章
- 状压DP POJ 3254 Corn Fields
题目传送门 /* 状态压缩DP:先处理硬性条件即不能种植的,然后处理左右不相邻的, 接着就是相邻两行查询所有可行的种数并累加 写错一个地方差错N久:) 详细解释:http://www.tuicool. ...
- poj - 3254 - Corn Fields (状态压缩)
poj - 3254 - Corn Fields (状态压缩)超详细 参考了 @外出散步 的博客,在此基础上增加了说明 题意: 农夫有一块地,被划分为m行n列大小相等的格子,其中一些格子是可以放牧的( ...
- poj 3254 Corn Fields
http://poj.org/problem?id=3254 Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissio ...
- POJ 3254. Corn Fields 状态压缩DP (入门级)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9806 Accepted: 5185 Descr ...
- POJ 3254 Corn Fields(状压DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13732 Accepted: 7216 Desc ...
- POJ 3254 Corn Fields(状态压缩DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4739 Accepted: 2506 Descr ...
- poj 3254 Corn Fields 国家压缩dp
意甲冠军: 要在m行n陆行,有一些格您可以种树,别人做不到的.不相邻的树,我问了一些不同的共同拥有的法律. 分析: 从后往前种,子问题向父问题扩展,当种到某一格时仅仅有他和他后面的n-1个格子的情况对 ...
- [ACM] POJ 3254 Corn Fields(状态压缩)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8062 Accepted: 4295 Descr ...
- POJ 3254 - Corn Fields - [状压DP水题]
题目链接:http://poj.org/problem?id=3254 Time Limit: 2000MS Memory Limit: 65536K Description Farmer John ...
随机推荐
- activity切换交互动画
activity切换的时候,想要有动画,那么... 1.想要有效果的activity设置theme <activity android:name=".MainActivity" ...
- js中基础数据类型
变量声明 undefined //未定义只声明 var age; alert(name);function fc(a1,a2,a3) { //alert(a1); //alert(a2); //a ...
- day05_08 列表讲解、切片、内置方法
1.0 查询: a = ['wuchao','jinxing','xiaohu','sanpang','ligang'] print(a[3]) #>>>sanpang prin ...
- Postgresql 查看建表语句 命令
pg_dump -U username databasename -W -s -t tablename -s, --schema-only 只转储模式, 不包括数据 -t, --table=TABLE ...
- Spring七大模块
七大模块,如下: 1. Spring Core: Core封装包是框架的最基础部分,提供IOC和依赖注入特性.这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性 ...
- JavaWeb笔记(二)Servlet
Tomcat目录简介 bin--可执行文件 conf--配置文件 lib--依赖jar包 logs--日志文件 temp--临时文件 webapps--默认项目部署路径 work--存放运行时的数据 ...
- 平时代码中不符合python风格的举例
良好的代码风格体现出自己的专业,良好的代码风格,方便同事之间协作. 下面举例讲讲自己在代码中不符合python风格的一些情况,方便自己写出优雅的代码. 段落之间空两行 很长的参数用括号连接但是不要超过 ...
- 记一次 pip list --outdated 错误
在 Windows CMD 执行 pip list --outdated,出现如下错误:" [WinError 10061] 由于目标计算机积极拒绝,无法连接",原因是我之前用的源 ...
- ACdream 1738 世风日下的哗啦啦族I(分块大法+二分)
世风日下的哗啦啦族I Time Limit: 4000/2000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit S ...
- [NOI2010][bzoj2005] 能量采集 [欧拉函数+分块前缀和优化]
题面: 传送门 思路: 稍微转化一下,可以发现,每个植物到原点连线上植物的数量,等于gcd(x,y)-1,其中xy是植物的横纵坐标 那么我们实际上就是要求2*sigma(gcd(x,y))-n*m了 ...