POJ 2411_Mondriaan's Dream
题意:
用1*2和2*1的方块将给定长宽的矩形填满。问有多少种放法,对称的算两种。
分析:
状态压缩dp
首先用0表示前一行没有竖块占用这个位置,而1表示该位置和他上方的位置放了一个竖块,从而压缩状态。接下来一行一行的看,每一行都只受上一行的影响,同时影响着下一行的状态,那么如何将现在的状态和下一行的状态联系起来呢?
- 令dp[i][j]表示第i行状态为j时的方案数,直接把两个状态作为参数进行DFS,在到达每行行尾时更新 dp[i+1][next];。
- 看poj的discuss中的方法,对于某一行来说,如果横着放了方块后,就将相应的位置置为1,而被上一行占用的位置也已经是1了,那么整行下来,就只有0的位置是要放竖块的了,而此时下一行对应的位置应该为1,可以发现下一行状态就是这一行状态的非!【感觉好巧妙啊!
因为要求正好填满,所以两种方法最后都可以是输出dp[h+1][0],但是第二种方法也就可以取反直接用dp[h][(1<<w)−1]求。
还有!!位运算注意括号!!
代码:
方法一:
#include<cstdio>
#include<cstring>
const int maxn = 15;
long long dp[maxn][1<<maxn];
int w, h;
void dfs(int a, int b, int now, int next)
{
if(b == w){
dp[a+1][next] += dp[a][now];
return;
}
if(now&(1<<b)) dfs(a, b + 1, now, next);
else {
dfs(a, b+1, now, next|1<<b);
if(b+1< w&&!(now&1<<(b+1)))
dfs(a, b+2, now, next);
}
return;
}
int main (void)
{
while(~scanf("%d%d",&h,&w)&&h+w){
memset(dp, 0, sizeof(dp));
dp[1][0] = 1;
dfs(1,0,0,0);
for(int i = 2; i <= h; i++){
for(int j = 0; j < 1<<w; j++){
if(dp[i][j]) dfs(i, 0, j, 0);
}
}
printf("%I64d\n",dp[h+1][0]);
}
}//266ms
方法二:
#include<cstdio>
#include<cstring>
const int maxn = 15;
long long dp[maxn][1<<maxn];
int w, h;
long long tmp;
void dfs(int a, int b, int now)
{
if(b == w){
dp[a][now] += tmp;
return;
}
dfs(a, b + 1,now);//要么被占要么放竖块
if(b+1<w&&!(now&1<<b)&&!(now&1<<(b+1)))
dfs(a, b+2, now|(1<<b)|(1<<(b+1)));
return;
}
int main (void)
{
while(~scanf("%d%d",&h,&w)&&h+w){
memset(dp, 0, sizeof(dp));
tmp = 1;
dfs(1,0,0);
for(int i = 2; i <= h; i++){
for(int j = 0; j < 1<<w; j++){
if(dp[i-1][j]) {
tmp = dp[i-1][j];
int next = ~j&((1<<w)-1);
dfs(i, 0, next);
}
}
}
printf("%I64d\n",dp[h][(1<<w)-1]);
}
}//250MS
POJ 2411_Mondriaan's Dream的更多相关文章
- POJ 2411Mondriaan's Dream
题目: Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after prod ...
- poj 2411 Mondriaan's Dream 【dp】
题目:id=2411" target="_blank">poj 2411 Mondriaan's Dream 题意:给出一个n*m的矩阵,让你用1*2的矩阵铺满,然 ...
- POJ 2411 Mondriaan's Dream -- 状压DP
题目:Mondriaan's Dream 链接:http://poj.org/problem?id=2411 题意:用 1*2 的瓷砖去填 n*m 的地板,问有多少种填法. 思路: 很久很久以前便做过 ...
- [poj P2411] Mondriaan's Dream
[poj P2411] Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 18023 A ...
- POJ 2411 Mondriaan's Dream 插头dp
题目链接: http://poj.org/problem?id=2411 Mondriaan's Dream Time Limit: 3000MSMemory Limit: 65536K 问题描述 S ...
- Poj 2411 Mondriaan's Dream(压缩矩阵DP)
一.Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, ...
- Mondriaan's Dream POJ - 2411
Mondriaan's Dream POJ - 2411 可以用状压dp,但是要打一下表.暴力枚举行.这一行的状态.上一行的状态,判断如果上一行的状态能转移到这一行的状态就转移. 状态定义:ans[i ...
- POJ 题目2411 Mondriaan's Dream(状压DP)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 13519 Accepted: 787 ...
- POJ 2411 Mondriaan's Dream
状压DP Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 9938 Accepted: 575 ...
随机推荐
- iOS----轻松掌握AFN网络顶级框架
AFN 一.什么是AFN 全称是AFNetworking,是对NSURLConnection的一层封装 虽然运行效率没有ASI高,但是使用比ASI简单 在iOS开发中,使用比较广泛 AFN的githu ...
- ES6语法糖集锦
sublime3安装Es6插件 javascriptNext,然后安装即可 JavaScriptNext - ES6 Syntax()高亮插件 -------------------------- ...
- php与其他一些相关工具的安装步骤分享
现在很少花时间来专门写博客,都是把平时看到用到的东西像随笔一样记录在云笔记上. 在这儿分享一些php相关的技术安装过程: linux下编译安装php:php安装 phpunit安装过程:phpunit ...
- 开放API接口
[开放API]——知乎.博客园等开放API接口(更新ing) Cnodejs.org: https://cnodejs.org/api/ 和风天气: http://docs.heweather.c ...
- web.xml的简单解释以及Hello1中web.xml的简单分析
一.web.xml的加载过程 ①当我们启动一个WEB项目容器时,容器包括(JBoss,Tomcat等).首先会去读取web.xml配置文件里的配置,当这一步骤没有出错并且完成之后,项目才能正常的被启动 ...
- vue按需加载组件-webpack require.ensure
使用 vue-cli构建的项目,在 默认情况下 ,执行 npm run build 会将所有的js代码打包为一个整体, 打包位置是 dist/static/js/app.[contenthash].j ...
- 六、面向切面的spring(2)
这个是承接五的,这部分主要的内容是在XML中声明切面. 一.在XML中声明切面 让我们先看一下spring中的AOP配置元素有哪些: AOP配置元素 用途 <aop:advisor> 定义 ...
- 浏览器通知Web Notifications实例页面
HTML代码: <button id="button">有人想加你为好友</button> <p id="text">< ...
- Cannot find class: com.mysql.jdbc.driver
mybatis配置mysql报错,信息如下 Cause: java.sql.SQLException: Error setting driver on UnpooledDataSource. Caus ...
- vue-router scrollBehavior的用法
问题: 使用keep-alive标签后部分安卓机返回缓存页位置不精确问题 解决方案: <div id="app"> <keep-alive> <rou ...