POJ 2411 Mondriaan's Dream/[二进制状压DP]
题目链接【http://poj.org/problem?id=2411】
题意:给出一个h*w的矩形1<=h,w<=11.用1*2和2*1的小矩形去填满这个h*w的矩形,问有多少种方案数?
题解:用0、1表示矩形中每个位置的状态,0表示没有被铺上木块,1表示已经被铺上木块,把每一行的状态看成是一个二进制数,用十进制表示。
每一行的总状态为[0,(1<<w)-1];dp[i][j]表示第i行,状态为j,并且i行以上都被填满了的总方案数。
因为r行的状态只和r-1排的状态有关,可以用滚动数组实现。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn = << ;
LL dp[][maxn];
int n, m;
int cur;
void DFS(int pos, int nu, int z)
{
if(pos == m)//处理第m个位置的时候本行已经处理完了
{
dp[cur][nu] += dp[cur ^ ][z];
return ;
}
if(!(z & ( << pos)))//如果上一行的pos位置是0,那么本行的pos位置必须是竖着放
DFS(pos + , nu | ( << pos), z);
else
{
if(pos && (!(nu & ( << pos - ))))//判断是否可以横着放
DFS(pos + , nu | ( << pos) | ( << pos - ), z);
DFS(pos + , nu, z);//不放木块,留着下一排去解决。
}
}
int main ()
{
while(~scanf("%d%d", &n, &m))
{
if(n == && m == )
break;
cur = ;
int mask = ( << m) - ;//可能的状态总数
memset(dp, , sizeof(dp));
dp[][mask] = ;//第一排的有效状态是mask
for(int i = ; i <= n; i++)
{
cur ^= ;
memset(dp[cur], , sizeof(dp[cur]));
for(int j = ; j <= mask; j++)
if(dp[cur ^ ][j])
DFS(, , j);
}
printf("%lld\n", dp[cur][mask]);
}
return ;
}
POJ 2411 Mondriaan's Dream/[二进制状压DP]的更多相关文章
- POJ 2411 Mondriaan's Dream 【状压Dp】 By cellur925
题目传送门 这道题暑假做的时候太模糊了,以前的那篇题解大家就别看了==.今天再复习状压感觉自己当时在写些什么鸭.... 题目大意:给你一个\(n\)*\(m\)的棋盘和许多\(1*2\)的骨牌,骨牌可 ...
- [poj 2411]Mondriaan's Dream (状压dp)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 18903 Accepted: 10779 D ...
- POJ 2411 Mondriaan's Dream (状压DP,骨牌覆盖,经典)
题意: 用一个2*1的骨牌来覆盖一个n*m的矩形,问有多少种方案?(1<=n,m<=11) 思路: 很经典的题目,如果n和m都是奇数,那么答案为0.同uva11270这道题. 只需要m个b ...
- POJ 题目2411 Mondriaan's Dream(状压DP)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 13519 Accepted: 787 ...
- [Poj2411]Mondriaan's Dream(状压dp)(插头dp)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 18096 Accepted: 103 ...
- POJ2411 Mondriaan's Dream 【状压dp】
没错,这道题又是我从LZL里的博客里剽过来的,他的题真不错,真香. 题目链接:http://poj.org/problem?id=2411 题目大意:给一个n * m的矩形, 要求用 1 * 2的小方 ...
- poj2411 Mondriaan's Dream[简单状压dp]
$11*11$格子板上铺$1*2$地砖方案.以前做过?权当复习算了,毕竟以前学都是浅尝辄止的..常规题,注意两个条件:上一行铺竖着的则这一行同一位一定要铺上竖的,这一行单独铺横的要求枚举集合中出现连续 ...
- poj2411 Mondriaan's Dream【状压DP】
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 20822 Accepted: 117 ...
- ☆ [POJ2411] Mondriaan's Dream 「状压DP」
传送门 >Here< 题意:用1*2的砖块铺满n*m的地板有几种方案 思路分析 状压经典题! 我们以$f[i][j]$作为状态,表示第i行之前全部填完并且第i行状态为j(状压)时的方案数. ...
随机推荐
- Ubuntu12.04 Eclipse 提示框背景色修改
I had to edit these files: /usr/share/themes/Ambiance/gtk-3.0/settings.ini /usr/share/themes/Ambianc ...
- JMX操作ActiveMQ(2)
默认情况下,ActiveMQ使用useJmx后,jmx的url为 service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi 这时,jmx的MBean se ...
- c语言栈的链表实现
#include <stdio.h> #include <stdlib.h> #include"PublicDS.h" typedef int ElemTy ...
- 在Node.js中使用RabbitMQ系列一 Hello world
在前一篇文章中可伸缩架构简短系列中提到过关于异步的问题.当时推荐使用RabbitMQ来做任务队列的实现方案.本篇文章以Node.js为例子,来实际操作如何和RabbitMQ进行交互. 介绍 Rabbi ...
- Node.js(初识)
之前有了解过一点Node.js,只是一直停留在文字描述,没有真正使用过Node.js,如今因为工作的原因,开始真正接触到Node.js,也开始深入学习. Node.js具体是用来做什么的,我想一开始接 ...
- jQuery核心结构简单分析
以下分析均采取沙箱模式 (function (window) { //为了提高性能把需要的变量统一提前声明 var arr = [], push = arr.push; //为区别jQuery,此文章 ...
- VSFTP服务——实验
一.VSFTP 作用:提供文件共享服务,可以应用在互联网中,实现外地登录服务器下载公司文件的功能,不区分客户端,在windows和linux中都是可以使用的 1.安装vsftpd [root@Serv ...
- printf输出格式
tips:#为空格 Printf 格式化字符串 格式代码 A ABC ABCDEFGH %S A ABC ABCDEFGH %5S ...
- [UWP小白日记-11]在UWP中使用Entity Framework Core(Entity Framework 7)操作SQLite数据库(一)
前言 本文中,您将创建一个通用应用程序(UWP),使用Entity Framework Core(Entity Framework 7)框架在SQLite数据库上执行基本的数据访问. 准备: Enti ...
- 基于C++的类编程总结
1. 类中public, protected, private这三个属性的区别: public意味着所有事物都能查询具有该属性的食物.(也即所有人可以在我不知情的情况下,查看我账户里还有多少钱). p ...