[Poj2411]Mondriaan's Dream(状压dp)(插头dp)
| Time Limit: 3000MS | Memory Limit: 65536K | |
| Total Submissions: 18096 | Accepted: 10357 |
Description

Expert as he was in this material, he saw at a glance that he'll need a computer to calculate the number of ways to fill the large rectangle whose dimensions were integer values, as well. Help him, so that his dream won't turn into a nightmare!
Input
Output
Sample Input
Sample Output
题意:
给出n * m的棋盘,问用1 * 2的骨牌铺满棋盘的方案数。
分析:
棋盘n,m很小,可以想到状压dp。一般的状压dp是枚举上一维的状态和当前这维状态然后转移。
在蓝书上P384页,也有一种解法。但是网上有另一种做法:http://blog.csdn.net/sf____/article/details/15026397
十分感谢博主的思路。
思路是这样的:
依然定义f[i][j][k],i为第i行,j为第第j列。k为二进制数,1 - k - 1位为当前行状态,k - m 为上一行状态,当前更新把第k位从上一行更新成当前行状态。
二进制中0表示下一行这个位置可以放数(即当前位置不放或者横着放),1表示下一行这个位置不可以放数(即当前位置竖着放)
可以得到dp状态:
dp[i][j][k ^ (1 << j)] += dp[i][j - 1][k]; -- 1 //竖着放 或者不放,因为不可能连续两行不放,所以k ^ (1 << j)和k相同位置必须有一位为1
dp[i][j][k ^ (1 << (j - 1))] += dp[i][j - 1][k]; --2 //从前一格竖着放的转移到当前位置横着放的 条件:当前这位上一格必须放了
因为i 和 j其实是刷表的,可以转移成dp[2][k];就可以了
AC代码:
# include <iostream>
# include <cstdio>
# include <cstring>
using namespace std;
const int N = << ;
long long dp[][N];
int n,m,data;
int main(){
while(~scanf("%d %d",&m,&n) && (n + m)){
data = ( << m);
if(m > n)swap(n,m);
int now = ;
memset(dp[now],,sizeof dp[now]);
dp[now][] = ;
for(int i = ;i < n;i++){
for(int j = ;j < m;j++){
now ^= ;
memset(dp[now],,sizeof dp[now]);
for(int k = ;k < data;k++)if(dp[now ^ ][k]){
dp[now][k ^ ( << j)] += dp[now ^ ][k];
if(j && (k & ( << (j - ))) && !(k & ( << j)))
dp[now][k ^ ( << (j - ))] += dp[now ^ ][k];
}
}
}
printf("%lld\n",dp[now][]);
}
}
[Poj2411]Mondriaan's Dream(状压dp)(插头dp)的更多相关文章
- [poj2411] Mondriaan's Dream (状压DP)
状压DP Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One nigh ...
- $POJ2411\ Mondriaan's\ Dream$ 状压+轮廓线$dp$
传送门 Sol 首先状压大概是很容易想到的 一般的做法大概就是枚举每种状态然后判断转移 但是这里其实可以轮廓线dp 也就是从上到下,从左到右地放方块 假设我们现在已经放到了$(i,j)$这个位置 那么 ...
- 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 链接:http://poj.org/problem?id=2411 题意:用 1*2 的瓷砖去填 n*m 的地板,问有多少种填法. 思路: 很久很久以前便做过 ...
- Poj 2411 Mondriaan's Dream(状压DP)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Description Squares and rectangles fascina ...
- 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\)时, ...
- P1879 [USACO06NOV]玉米田Corn Fields 状压dp/插头dp
正解:状压dp/插头dp 解题报告: 链接! ……我真的太菜了……我以为一个小时前要搞完的题目调错误调了一个小时……90分到100我差不多搞了一个小时…… 然后这题还是做过的……就很气,觉得确实是要搞 ...
- poj2411 Mondriaan's Dream (轮廓线dp、状压dp)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17203 Accepted: 991 ...
- poj2411 Mondriaan's Dream【状压DP】
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 20822 Accepted: 117 ...
随机推荐
- PMP项目管理学习笔记(3)——过程框架
所有项目,不论大小,都可以分解为过程组: 如果项目规模很大,可以分阶段管理,每个阶段都要经过上面的五个过程组,从启动到收尾. 阶段的类型: 顺序阶段: 一个阶段完成后进入下个阶段. 重叠阶段: 有时需 ...
- 第十三周翻译:SQL Server安全级别1:SQL Server安全性概述
SQL Server安全级别1:SQL Server安全性概述 源自:Stairway to SQL Server Security Level 1: Overview of SQL Server S ...
- 洛谷 P1021 邮票面值设计
题目描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤15)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1-MAX之间的每一个邮资值都能得到 ...
- 手把手教你免费把网站IP换成1.1.1.1/1.0.0.1
近日,Cloudflare官方发文,与APNIC官方合作打算用IP1.1.1.1推出速度更快.私密性更强的DNS Cloudflare 运行全球规模最大.速度最快的网络之一. APNIC 是一个非营利 ...
- (转)搭建Spring4.x.x开发环境
http://blog.csdn.net/yerenyuan_pku/article/details/52831306 先去Spring官网下载Spring4.x.x开发包(本人使用的版本是Sprin ...
- chrome 打开上次关闭的tab ctrl+shift+T
chrome 打开上次关闭的tab ctrl+shift+T
- Spread / Rest 操作符
Spread / Rest 操作符指的是 ...,具体是 Spread 还是 Rest 需要看上下文语境. 当被用于迭代器中时,它是一个 Spread 操作符:(参数为数组) function foo ...
- Vue之数据绑定
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ios之coretext
API接口文档. https://developer.apple.com/library/mac/#documentation/Carbon/Reference/CoreText_Framework_ ...
- VS C++项目报错warning C4199: ……use /Zc:twoPhase-
具体的报错如下: c1xx : warning C4199: two-phase name lookup is not supported for C++/CLI, C++/CX, or OpenMP ...