【poj2411】 Mondriaan's Dream

http://poj.org/problem?id=2411 (题目链接)

题意

  一个$n*m$的网格,用$1*2$的方块填满有多少种方案。

Solution

  轮廓线dp板子。按格dp,对上方和左方的格子的占用情况进行讨论转移。0表示已放置,1表示未放置。

细节

  LL,滚动清空数组。

代码

// poj2411
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define HAS 4001
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;

const int maxs=100010;
LL f[2][maxs];
int n,m,bin[30];

int main() {
	bin[0]=1;for (int i=1;i<=20;i++) bin[i]=bin[i-1]<<1;
	while (scanf("%d%d",&n,&m)!=EOF && n && m) {
		memset(f,0,sizeof(f));
		int p=0;f[0][0]=1;
		for (int i=0;i<n;i++)
			for (int j=0;j<m;j++) {
				p^=1;memset(f[p],0,sizeof(f[p]));
				for (int st=0;st<bin[m];st++) if (f[p^1][st]) {
						int left=j ? st>>(j-1)&1 : 0,up=st>>j&1;
						if (up) f[p][st^bin[j]]+=f[p^1][st];
						else {
							if (left) f[p][st^bin[j-1]]+=f[p^1][st];
							f[p][st^bin[j]]+=f[p^1][st];
						}
					}
			}
		printf("%lld\n",f[p][0]);
	}
    return 0;
}

【poj2411】 Mondriaan's Dream

时间: 2024-10-12 19:32:34

【poj2411】 Mondriaan's Dream的相关文章

POJ 2411【题解】Mondriaan&#39;s Dream 状压DP

题目链接:http://poj.org/problem?id=2411 把每一行当作一个二进制状态. 1表示是一个竖着的1*2的方格. 0表示其他状态. 那么显然当i-1的状态k能转移到i的j: 1.j 和 k 的按位与为0.(有1必须要0,0也可以有1) 2.j 和 k 按位或每一段0都有偶数个.(表示横着的长方形) 那么就可以预处理一下合格的点. 然后状压DP. 代码如下: #include<cstdio> using namespace std; int n,m; long long f

【POJ 2411】Mondriaan&#39;s Dream(状压dp)

[POJ 2411]Mondriaan's Dream(状压dp) Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 14107   Accepted: 8152 Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in hi

【学校集训】【USACO15DecG】Bessie&#39;s Dream

点此进入原题 (注:上面的参考译文是有问题的,等一下会在题解中说明) 算法:最短路或搜索(BFS) 题解: 本题用最短路可以做,但是构图比较麻烦,搜索要相对简单一点. 搜索需要四个量表示状态:(x,y)坐标,一个bool型变量表示是否有橘子味,还有一个量来表示方向(处理紫色方块时要用) 对于当前状态,如果前一个状态所在坐标代表紫色瓷砖并且可以继续滑行(按原方向下一个坐标所代表的不是粉红色或蓝色瓷砖),那么你就要继续按照原方向滑行. 否则就枚举4个方向然后按照相应情况判断是否有橘子味,之后就是朴素

【HDU4686】Arc of Dream

链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=46252 傻逼矩阵加速..QwQ #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define mod 1000000007 usi

poj2411 Mondriaan&#39;s Dream【状压DP】

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 20822   Accepted: 11732 Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet serie

poj 2411 Mondriaan&#39;s Dream 【dp】

题目:poj 2411 Mondriaan's Dream 题意:给出一个n*m的矩阵,让你用1*2的矩阵铺满,然后问你最多由多少种不同的方案. 分析:这是一个比较经典的题目,网上各种牛B写法一大堆.题解也是 我们可以定义状态:dp[i][st]:在第 i 行状态为 st 的时候的最大方案数. 然后转移方程:dp[i][st] = sum (dp[i-1][ss]) 即所有的当前行都是由上一行合法的状态转移而来. 而状态的合法性由两种铺法得到,第一种横放,注意要求前一行全满,然后竖放,上一行为空

POJ 3411 Mondriaan&#39;s Dream 【状压Dp】 By cellur925

Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series' (where he had to use his toilet paper to draw on, for all of his paper was filled with squares and rectangles),

Mondriaan&#39;s Dream【状压DP】

测评传送门 题意: 给定一个 n*m 的矩形,用1*2的方块填充的所有方案数 Sample Input 1 2 1 3 1 4 2 2 2 3 2 4 2 11 4 11 0 0 Sample Output 1 0 1 2 3 5 144 51205 思路: 像这样看上去就不会做的题目数据范围一般都不大(因为要用状压呀,大了能存的下吗?) 而且显然答案会很大,所以记得开 long long 正题---- 我们可以一行一行地看,对于上一行地情况,可以是横着的也可以是竖着的,横着的对我们当前这一行的

POJ2411(Mondriaan&#39;s Dream)

题目链接:传送门 题目大意:用1*2大小的砖块去铺满n*m大小的地面,有多少种方案 题目思路:因为1<=n,m<=11,并且砖块是1*2,故可以用二进制思想,也就是状态压缩DP,其中矩阵中为0的元素表示当前位置竖着放一块砖,而连着 两个1表示横着放一块砖(状态压缩真的很奇妙) #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <