关闭

Mondriaan's Dream POJ - 2411 状压DP

标签: dppoj
131人阅读 评论(0) 收藏 举报
分类:
用2进制的01表示不放还是放
第i行只和i-1行有关
枚举i-1行的每个状态,推出由此状态能达到的i行状态
如果i-1行的出发状态某处未放,必然要在i行放一个竖的方块,所以我对上一行状态按位取反之后的状态就是放置了竖方块的状态。
然后用搜索扫一道在i行放横着的方块的所有可能,并且把这些状态累加上i-1的出发状态的方法数,如果该方法数为0,直接continue。
举个例子
2 4
1111
1111
状态可以由
1100 0000 0110 0011 1111
0000 0000 0000 0000 0000
这五种i-1的状态达到,故2 4 的答案为5
代码:
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std;
#define maxn 12
long long dp[2][1 <<maxn];
int h, w;


int main() {
	while (scanf("%d %d", &h, &w) != EOF&&h) {
		memset(dp, 0, sizeof(dp));
		long long *now = dp[0], *next = dp[1];
		now[0] = 1;


		for (int i = h - 1; i >= 0; i--) {
			for (int j = w - 1; j >= 0; j--) {
				for (int s = 0; s < 1 << w; s++) {
					if (s >> j & 1) {				//不用在(i,j)铺砖
						next[s] = now[s&~(1 << j)];
					}
					else {
						long long cnt = 0;
						//横着放
						if (j + 1 < w && !(s >> (j + 1) & 1)) {
							cnt += now[s | 1 << (j + 1)];
						}
						//竖着放
						if (i + 1 < h) {
							cnt += now[s | 1 << j];
						}
						next[s] = cnt;
					}
				}
				swap(now, next);
			}
		}
		printf("%lld\n", now[0]);
	}
}
一开始万般纠结于横放竖放的代码那里。。
想了很久才明白j不代表坐标。。所以位操作控制的是同一个位
记住顶端的才是需要考虑的。。一开始白书上那图还觉得迷,总算看懂了
今儿不熬夜了吧,快开学了调一下生物钟
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

poj2411 2663 2420 dp+状态压缩(多米诺骨牌问题)

题目描述:用1*2 的矩形通过组合拼成大矩形,求拼成指定的大矩形有几种拼法。 首先 我们先求用1*2 的矩形拼成 n*m的矩形有多少种拼法 当n*m为奇数时,一定是不会拼出来的,因为想要拼出来就需...
  • shiwei408
  • shiwei408
  • 2013-04-19 00:04
  • 7265

POJ2411 状态压缩DP

POJ2411 Mondriaan's Dream 给你n*m(1矩阵,要求用1*2的多米诺骨牌去填充,问有多少种填充方法。 分析: 首先我们定义如下这种填充表示方式:如果一个骨牌是横着放的,那么它所...
  • u013480600
  • u013480600
  • 2014-02-20 20:17
  • 1615

poj2411之用1*2砖块铺满n*m-状态压缩dp

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 10549   Accepte...
  • xingyeyongheng
  • xingyeyongheng
  • 2014-03-21 08:52
  • 6073

poj2411 Mondriaan's Dream--状压dp

原题链接:http://poj.org/problem?id=2411 . 题意:一个n*m的方格,给定一个1*2的方块,要求用这个方块填充方格,填满,一共多少种填充方法。 分析:对于一...
  • LaoJiu_
  • LaoJiu_
  • 2016-10-26 13:22
  • 281

poj 2411 Mondriaan's Dream 经典状压DP+记忆化搜索

转送门:poj 2411 Mondriaan’s Dream题目大意给出一个n*m的棋盘,及一个小的矩形1*2,问用这个小的矩形将这个大的棋盘覆盖有多少种方法。解题思路因为对应于一个方格来讲,有两种状...
  • woshinannan741
  • woshinannan741
  • 2016-08-02 01:14
  • 172

poj 2411 Mondriaan's Dream(状压DP->求铺方格的方法数)@

Mondriaan's Dream Time Limit:10000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I...
  • yjf3151731373
  • yjf3151731373
  • 2017-04-24 10:30
  • 145

POJ2411 Mondriaan's Dream 【状压dp】

题目链接:http://poj.org/problem?id=2411题意: 有一个n*m的矩形,有若干个2*1的小长方形,问用小长方形把这个矩形铺满的方案书,多组输入,以 0 0为结束题解: 在...
  • qq_34896694
  • qq_34896694
  • 2017-03-26 08:46
  • 220

poj2411 Mondriaan's Dream(状压dp)

Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producin...
  • qq_33362864
  • qq_33362864
  • 2017-08-02 23:38
  • 76

POJ 2411 Mondriaan's Dream [状压DP做法]

状压DP(多米诺骨牌问题)
  • SenyeLicone
  • SenyeLicone
  • 2017-02-22 18:48
  • 228

POJ 2411-Mondriaan's Dream(状压DP->骨牌铺满问题)

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17226...
  • haut_ykc
  • haut_ykc
  • 2017-08-07 20:05
  • 643
    个人资料
    • 访问:11077次
    • 积分:1366
    • 等级:
    • 排名:千里之外
    • 原创:130篇
    • 转载:5篇
    • 译文:3篇
    • 评论:0条
    友链%%%