码迷,mamicode.com
首页 > 其他好文 > 详细

【poj2411】 Mondriaan's Dream

时间:2017-02-19 22:00:07      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:problem   target   滚动   题意   数组   for   include   清空   ring   

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

标签:problem   target   滚动   题意   数组   for   include   清空   ring   

原文地址:http://www.cnblogs.com/MashiroSky/p/6417168.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!