poj2411 Mondriaan's Dream

Posted MashiroSky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2411Mondriaan's Dream(状压dp)

POJ 2411 Mondriaan's Dream

POJ 2411Mondriaan's Dream

[poj P2411] Mondriaan's Dream

poj2411 Mondriaan's Dream状压DP

poj2411 Mondriaan's Dream