关闭

poj2411 Mondriaan's Dream--状压dp

标签: pojACMdfsdp
297人阅读 评论(0) 收藏 举报
分类:

原题链接:http://poj.org/problem?id=2411

.

题意:一个n*m的方格,给定一个1*2的方块,要求用这个方块填充方格,填满,一共多少种填充方法。


分析:对于一行的某一列来说,该列有三种:横着,竖着,不填。首先dfs求出一行可以有多少种可能。再枚举每种可能,直接看代码,不难的。


#define _CRT_SECURE_NO_DEPRECATE

#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
#include<stack>
#include<algorithm>
#include<cmath>
#include<string>
#include<stdio.h>
#define INF 99999999
#define eps 0.0001
using namespace std;
 
int w, h;
int num;
long long dp[12][1 << 11];
int path[11 * (1 << 11)][2];

void dfs(int l, int now, int pre)
{
	if (l > w)
		return;
	if (l == w)
	{
		path[num][0] = pre;
		path[num++][1] = now;
		return;
	}

	dfs(l + 2, (now << 2) | 3, (pre << 2) | 3);//横着放
	dfs(l + 1, (now << 1) | 1, pre << 1);//竖着放
	dfs(l + 1, now << 1, (pre << 1) | 1);//不放
}

int main()
{
	while (~scanf("%d%d", &w, &h) && (w || h))
	{
		if (w*h % 2 == 1)
			printf("0\n");
		else
		{
			if (w > h)
				swap(w, h);
			num = 0;
			dfs(0, 0, 0);//记住第一个参数是0,不是1,因为对于最后一列,如果是1,等到了w列,正好退出,只有0才会把w列考虑进去
			memset(dp, 0, sizeof(dp));
			dp[0][(1 << w) - 1] = 1;
			for (int i = 0; i < h; i++)
				for (int j = 0; j < num; j++)
					dp[i + 1][path[j][1]] += dp[i][path[j][0]];
			printf("%lld\n", dp[h][(1 << w) - 1]);
			
		}
	}
	return 0;
}




1
0
查看评论

poj2411Mondriaan's Dream题解

题目大意:给出h*w(1≤h、w≤11)的方格棋盘,用1*2 的长方形骨牌不重叠地覆盖这个 棋盘,求覆盖满的方案数。 输入文件包含多组数据。 每组数据有一行,两个正整数h,w。 输入结束标志为h=w=0. 对每组数据,输出一行一个正整数,即方案总数。解析详见代码:#include<c...
  • qq_27138357
  • qq_27138357
  • 2015-08-01 17:43
  • 467

poj2411--Mondriaan's Dream(状压dp+dfs)

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 12315   Accepted: 7189 Descrip...
  • u013015642
  • u013015642
  • 2015-02-04 20:49
  • 837

POJ-2411-Mondriaan's Dream-轮廓线dp(插头dp)

题意:在n*m的方格里铺1*2的骨牌,有多少种可能,首先可以排除一些特殊情况,n*m是奇数,就是0 n或m是1就是1(已经排除n*m的情况)。然后就和我之前写的hdu1992的插头dp一样 #include #include #include #include #include using na...
  • lyc1635566ty
  • lyc1635566ty
  • 2016-08-09 00:31
  • 418

POJ2411:Mondriaan's Dream(状态压缩)

Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet ser...
  • libin56842
  • libin56842
  • 2014-05-04 22:44
  • 2683

poj 2411 Mondriaan's Dream(状态压缩dp)

Mondriaan's Dream Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the ...
  • u014634338
  • u014634338
  • 2015-11-24 17:27
  • 884

[POJ2411] Mondriaan's Dream 状压dp

[POJ2411] Mondriaan’s Dream 状压dp原题:POJ2411**题意:**N*M的矩阵,用1*2的砖铺,要求不能超出边界并且铺满所有格子,问有多少种铺法?(1<=N,M<=11)(1 <= N, M <= 11)。题解: 砖铺问题。 用dfs写法写...
  • chbug
  • chbug
  • 2016-07-12 20:35
  • 167

poj2411 Mondriaan's Dream(状压dp)

用1*2的小木块覆盖n*m的格子,问方案数。n,m<=10.状压dp,用二进制数表示一行的状态,逐行转移。横放用11表示,竖放用01表示。a[s]存的是上一行状态为s,能转移到的所有状态。初始值f[0][tot]=1,表示第0行全为1的方案有1个。最后答案就是f[n][tot]。复杂度不会算啊...
  • Icefox_zhx
  • Icefox_zhx
  • 2017-10-12 21:46
  • 79

POJ2411:Mondriaan's Dream(状压dp)

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 16037   Accepted: 9...
  • junior19
  • junior19
  • 2017-02-19 20:23
  • 115

poj2411 mondriaan's dream 状压dp

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 10925   Accepted: 6...
  • u011645923
  • u011645923
  • 2014-05-06 14:22
  • 716

状压dp Mondriaan's Dream poj2411

超经典的一道题目,实现这题的方法也有很多种 1.利用DFS建立矩阵,然后通过快速矩阵幂得到答案(运用于min(m,n)比较小,但是max(m,n)非常大的情况) 2.利用dp状压解决 第一种在我的另一篇博客里有 http://blog.csdn.net/qwb492859377/article/...
  • qwb492859377
  • qwb492859377
  • 2015-08-02 01:15
  • 1018
    个人资料
    • 访问:443939次
    • 积分:7711
    • 等级:
    • 排名:第3285名
    • 原创:395篇
    • 转载:52篇
    • 译文:0篇
    • 评论:45条
    最新评论