POJ-2411 Mondriann's Dream (状压DP)
求把\(N*M(1\le N,M \le 11)\) 的棋盘分割成若干个\(1\times 2\) 的长方形,有多少种方案。例如当 \(N=2,M=4\)时,共有5种方案。当\(N=2,M=3\)时,有3种方案。
NM只有11,八九不离十可以状压了,反正得挨个铺,所以从上到下考虑。假如现在铺好了前\(i\) 层,基本思想就是从\(i\) 层的状态转移到\(i+1\)层的状态。但是该如何表示?观察一下铺满第 \(i\) 层的样子(必须保证第\(i\)层是满的,也就是说有的可以凸出来到\(i+1\)层但是要保证\(i\)层是满的)

对于第 i 行中竖着放的,第 \(i+1\) 层要受到牵连,它必须补全竖着放置的上一半才行。但对于横着放的,第\(i+1\)层则无所谓。
所以我们可以用二进制中的 1 来表示他是否是竖着放置的上一半。为0则为其他状况。
\(d[i][j]\)表示第 \(i\) 的形态为\(j\) 时,前\(i\) 行分割方案的总数。 \(j\) 是用十进制整数记录的 \(m\) 位二进制数。考虑\(i+1\)行的状态\(k\)在满足什么情况下转移是合法的。
- \(j\)中为 1 的位,\(k\)中必须为0
- \(j\)中为 0 的位,\(k\)中可以为1,但 k 要是为 0,就必须是连续的偶数个0(想一想为什么)
对于第一条,可以用 \(i\&j = 0\) 来判断,对于第二条,有\(z = i|j\),那么 z 的二进制表示中,每一段连续的 0 都必须有偶数个。(这些0代表若干个横着的 \(1\times 2\) 长方形,奇数个0无法分割成这种形态。
#include <iostream>
#include <cstdio>
using namespace std;
int n,m;
long long f[12][1<<11];
bool in_s[1<<11];
int main(){
while(cin>>n>>m && n){
//先把合法状态筛出来,即二进制表示中每一段连续的0都有偶数个
for(int i=0;i<1<<m;i++){
bool cnt = 0,has_odd = 0;
for(int j=0;j<m;j++)
if(i >> j & 1)has_odd |= cnt,cnt=0;
else cnt ^= 1;
in_s[i] = (has_odd | cnt) ? 0 : 1;
}
f[0][0] = 1;
for(int i=1;i<=n;i++){
for(int j=0;j<1<<m;j++){
f[i][j] = 0;
for(int k=0;k< 1<<m;k++){
if((j & k) == 0 && in_s[j|k])
f[i][j] += f[i-1][k];
}
}
}
cout<<f[n][0]<<endl;
}
return 0;
}
POJ-2411 Mondriann's Dream (状压DP)的更多相关文章
- POJ 2411 Mondriaan's Dream -- 状压DP
题目:Mondriaan's Dream 链接:http://poj.org/problem?id=2411 题意:用 1*2 的瓷砖去填 n*m 的地板,问有多少种填法. 思路: 很久很久以前便做过 ...
- POJ 2411 Mondriaan's Dream ——状压DP 插头DP
[题目分析] 用1*2的牌铺满n*m的格子. 刚开始用到动规想写一个n*m*2^m,写了半天才知道会有重复的情况. So Sad. 然后想到数据范围这么小,爆搜好了.于是把每一种状态对应的转移都搜了出 ...
- Poj 2411 Mondriaan's Dream(状压DP)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Description Squares and rectangles fascina ...
- POJ 2411 Mondriaan'sDream(状压DP)
题目大意:一个矩阵,只能放1*2的木块,问将这个矩阵完全覆盖的不同放法有多少种. 解析:如果是横着的就定义11,如果竖着的定义为竖着的01,这样按行dp只需要考虑两件事儿,当前行&上一行,是不 ...
- [poj2411] Mondriaan's Dream (状压DP)
状压DP Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One nigh ...
- POJ 1185 炮兵阵地(状压DP)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 26426 Accepted: 10185 Descriptio ...
- poj 2288 Islands and Bridges ——状压DP
题目:http://poj.org/problem?id=2288 状压挺明显的: 一开始写了(记忆化)搜索,但一直T: #include<iostream> #include<cs ...
- 【POJ 2923】Relocation(状压DP+DP)
题意是给你n个物品,每次两辆车运,容量分别是c1,c2,求最少运送次数.好像不是很好想,我看了网上的题解才做出来.先用状压DP计算i状态下,第一辆可以运送的重量,用该状态的重量总和-第一辆可以运送的, ...
- POJ 1185 炮兵阵地 (状压DP)
题目链接 题意 : 中文题不详述. 思路 :状压DP,1表示该位置放炮弹,0表示不放.dp[i][j][k],代表第 i 行的状态为k时第i-1行的状态为 j 时放置的最大炮弹数.只是注意判断的时候不 ...
随机推荐
- (解决)easypoi模板导出多个excel文件并压缩
目录 easypoi版本--3.1.0 实现代码 后语 easypoi版本--3.1.0 实现代码 public void export(HttpServletResponse response, H ...
- 在 WPF 中使用 MahApps.Metro.IconPacks 提供的大量图标
MahApps.Metro.IconPacks https://github.com/MahApps/MahApps.Metro.IconPacks 提供了大量的高质量的图标供WPF使用,极其方便. ...
- UVA - 185 Roman Numerals
题目链接: https://vjudge.net/problem/UVA-185 思路: 剪枝.回溯 注意回溯的时候,是从当前点的下一个开始,而不是从已经遍历的个数点开始!!不然回溯有问题! 思路参考 ...
- RCE - Pikachu
概述: 远程系统命令执行 一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口 比如我们常见的路由器.防火墙.入侵检测等设备的web管理界面上 一般会给用户提供一个ping操 ...
- ctfhub技能树—sql注入—过滤空格
手注 查询数据库 -1/**/union/**/select/**/database(),2 查询表名 -1/**/union/**/select/**/group_concat(table_name ...
- dblink查找对应的目标端session
v$session试图中process字段代表的是客户端所在机器的进程号 例如我使用toad连接数据库,查询到的process即toad的进程号 SELECT process FROM V$SESSI ...
- WCNSS_qcom_cfg.ini WIFI配置文件参数详细解析
STA相关的一般配置 参数 含义 最小值 最大值 默认值 gNeighborLookupThreshold 1 触发roam scan发生的条件在WCNSS_qcom_cfg.ini文件中gNeigh ...
- 使用存储过程在mysql中批量插入数据
一.在mysql数据库中创建一张表test DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `id` INT (11), `name` VARCH ...
- CoeMonkey少儿编程第4章 变量
点击这里,现在就开启CodeMonkey的趣味编程之旅. 目标 了解什么是变量 了解变量的命名规则 掌握如何使用变量 变量 什么是变量?顾名思义,变量就是可以变化的量. 和变量相对的是常量,即不可变化 ...
- 《UML与设计原则》--第四小组
关于设计模式与原则 一.设计模式简介 设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案.而面向对象设计模式描述了面向对象设计过程中特定场景下.类与相互通信的对象之间常见的组织关系. 二.G ...