睡前小dp-poj3254-状压dp入门
http://poj.org/problem?id=3254
从这里学的 http://blog.csdn.net/accry/article/details/6607703
状压dp的入门题。一片N×M的田地,有的地方可以种玉米,有的地方不可以。种玉米的区块不能相邻。种玉米的求总方案数,不种玉米也是一种方案。
每一行总共2^N种状态,其中删去有相邻的状态,删除不符合给定条件的状态。保留下最终的所有状态。然后开始dp。
从上往下,每一行之依赖于上一行。所以从上一行转移过去,把状态数加起来就行了。
其中几个函数写的比较精妙,结合二进制运算理解一下并不难。
/*--------------------------------------------------------------------------------------*/
// Helica's header
// Second Editions
// 2015.11.7
//
#include <algorithm>
#include <iostream>
#include <cstring>
#include <ctype.h>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <string>
#include <queue>
#include <stack>
#include <cmath>
#include <set>
#include <map> //debug function for a N*M array
#define debug_map(N,M,G) printf("\n");for(int i=0;i<(N);i++)\
{for(int j=;j<(M);j++){\
printf("%d",G[i][j]);}printf("\n");}
//debug function for int,float,double,etc.
#define debug_var(X) cout<<#X"="<<X<<endl;
/*--------------------------------------------------------------------------------------*/
using namespace std; const int MOD = ;
int N,M,T;
int dp[][],state[],cur[];
int cnt;
bool ok(int x)
{
if(x&(x<<)) return ;
return ;
} bool fit(int s,int c)
{
if(s&c) return ;
return ;
} int main()
{
while(~scanf("%d%d",&N,&M))
{
for(int i=;i<=N;i++)
{
cur[i] = ;
for(int j=;j<=M;j++)
{
int a;
scanf("%d",&a);
if(a==) cur[i] += (<<(M-j));
}
}
cnt=;
for(int i=;i < <<M;i++) if(ok(i))
{
state[++cnt] = i;
} memset(dp,,sizeof dp);
for(int i=;i<=cnt;i++) if(fit(state[i],cur[]))
dp[][i] = ; for(int i=;i<=N;i++)
{
for(int j=;j<=cnt;j++)
{
if(!fit(state[j],cur[i])) continue;
for(int k=;k<=cnt;k++)
{
if(!fit(state[k],cur[i-])) continue;
if(state[j]&state[k]) continue;
dp[i][j] = (dp[i][j]+dp[i-][k])%MOD;
}
}
}
int ans = ;
for(int i=;i<=cnt;i++) ans = (ans+dp[N][i])%MOD;
printf("%d\n",ans);
}
}
睡前小dp-poj3254-状压dp入门的更多相关文章
- 树形DP和状压DP和背包DP
树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...
- dp乱写1:状态压缩dp(状压dp)炮兵阵地
https://www.luogu.org/problem/show?pid=2704 题意: 炮兵在地图上的摆放位子只能在平地('P') 炮兵可以攻击上下左右各两格的格子: 而高原('H')上炮兵能 ...
- poj2411 Mondriaan's Dream (轮廓线dp、状压dp)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17203 Accepted: 991 ...
- poj3254状压DP入门
G - 状压dp Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:65536KB 64bit ...
- POJ3254 状压dp
Corn ...
- dp,状压dp等 一些总结
也就作业几题而已,分析一下提醒 最重要的就是,记住,没用的状态无论怎么转移最后都会是没用的状态,所以每次转移以后的有值的状态都是有用的状态. 几种思考方向: 第一种:枚举当前的状态,转移成另外一个状态 ...
- BZOJ 4042 Luogu P4757 [CERC2014]Parades (树形DP、状压DP)
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4042 (Luogu) https://www.luogu.org/prob ...
- hoj 2662 经典状压dp // MyFirst 状压dp
题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2662 1.引言:用dp解决一个问题的时候很重要的一环就是状态的表示,一般来说,一个数组即可保存状态. ...
- 【BZOJ3925】地震后的幻想乡(期望概率DP,状压DP)
题意:给定一张点数不超过10的无向连通图,每条边有一个[0,1]之间的随机权值,求最小生成树上最大边的期望值 提示:对于n个[0,1]之间的随机变量x1,x2,...,xn,第k小的那个的期望值是k/ ...
- hdu4352 XHXJ's LIS[数位DP套状压DP+LIS$O(nlogn)$]
统计$[L,R]$内LIS长度为$k$的数的个数,$Q \le 10000,L,R < 2^{63}-1,k \le 10$. 首先肯定是数位DP.然后考虑怎么做这个dp.如果把$k$记录到状态 ...
随机推荐
- arcgis_js_api_3.12的project实践
esri.config.defaults.geometryService = new esri.tasks.GeometryService("http://localhost:6080/ar ...
- SecureRandom
我们知道,Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字. 相同种子数的Ra ...
- Luogu4219 BJOI2014 大融合 LCT
传送门 题意:写一个数据结构,支持图上连边(保证图是森林)和询问一条边两端的连通块大小的乘积.$\text{点数.询问数} \leq 10^5$ 图上连边,$LCT$跑不掉 支持子树$size$有点麻 ...
- React-用create-react-app搭建项目
安装create-react-app npm install -g create-react-app 装完之后,生成一个新的项目,可以使用下面的命令: create-react-app my-app ...
- Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package
1.在搭建SpringBoot框架时碰到的问题. ** WARNING ** : Your ApplicationContext is unlikely to start due to a @Comp ...
- 解决RobotFramework的关键字不能高亮的问题
一个可能的原因:路径中存在汉字,RobotFramework对这方面运行的不太好.
- [Oracle]快速构造大量数据的方法
[Oracle]快速构造大量数据的方法: create table tab001(id integer primary key, val varchar2(100)); insert into tab ...
- 《Linux内核设计与实现》第17章学习笔记
第17章.设备与模块 17.1设备类型 1.块设备(blkdev): 寻址以块为单位,通常支持重定位操作.通过称为“块设备节点”的特殊文件来访问. 2.字符设备(cdev): 不可寻址,仅提供数据的流 ...
- <<浪潮之巅>>阅读笔记二
好的文章总是慢慢吸引着你去阅读,这本书的作者是吴军博士,让我很钦佩的是他还是一个很著名的程序员.其实我感觉理科生在写作方面的能力是很欠缺的,我们经常做到了有观点,但是做不到和别人表达清楚你的观点想法, ...
- <<浪潮之巅>>阅读笔记一
第一次的阅读就想读这本书的,却因为很多愿意一直拖到现在,因为听说这本书在李开复先生 的微博上有推荐,更是增加了我的阅读兴趣.可能是因为在网上找的电子版的原因,通篇阅读的速度很快,但是没有纸质数那种细嚼 ...