POJ 题目2411 Mondriaan's Dream(状压DP)
| Time Limit: 3000MS | Memory Limit: 65536K | |
| Total Submissions: 13519 | Accepted: 7876 |
Description

Expert as he was in this
material, he saw at a glance that he'll need a computer to calculate the number
of ways to fill the large rectangle whose dimensions were integer values, as
well. Help him, so that his dream won't turn into a nightmare!
Input
is made up of two integer numbers: the height h and the width w of the large
rectangle. Input is terminated by h=w=0. Otherwise, 1<=h,w<=11.
Output
For each testcase, output the number of different ways the given rectangle can be filled with
small rectangles of size 2 times 1. Assume the given large rectangle is
oriented, i.e. count symmetrical tilings multiple times.
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
Source
| 196K | 16MS |
#include<stdio.h>
#include<string.h>
#define LL __int64
LL dp[2][1<<12];
int n,m;
LL add;
void dfs(int i,int p,int pos)
{
if(pos==m)
{
dp[i][p]+=add;
return;
}
dfs(i,p,pos+1);
if(pos<m-1&&!(p&(1<<pos))&&!(p&(1<<(pos+1))))
{
dfs(i,p|(1<<pos)|(1<<(pos+1)),pos+2);
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF,n||m)
{
if(n*m%2)
{
printf("0\n");
continue;
}
int rt=(1<<m)-1;
memset(dp,0,sizeof(dp));
add=1;
dfs(0,0,0);
int i,j;
for(i=1;i<n;i++)
{
memset(dp[i%2],0,sizeof(dp[i%2]));
for(j=0;j<=rt;j++)
{
if(dp[(i-1)%2][j])
{
add=dp[(i-1)%2][j];
dfs(i%2,~j&rt,0);
}
}
}
printf("%I64d\n",dp[(n-1)%2][rt]);
}
}
POJ 题目2411 Mondriaan's Dream(状压DP)的更多相关文章
- POJ 2411 Mondriaan's Dream -- 状压DP
题目:Mondriaan's Dream 链接:http://poj.org/problem?id=2411 题意:用 1*2 的瓷砖去填 n*m 的地板,问有多少种填法. 思路: 很久很久以前便做过 ...
- POJ 2411 Mondriaan's Dream ——状压DP 插头DP
[题目分析] 用1*2的牌铺满n*m的格子. 刚开始用到动规想写一个n*m*2^m,写了半天才知道会有重复的情况. So Sad. 然后想到数据范围这么小,爆搜好了.于是把每一种状态对应的转移都搜了出 ...
- Poj 2411 Mondriaan's Dream(状压DP)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Description Squares and rectangles fascina ...
- [poj2411] Mondriaan's Dream (状压DP)
状压DP Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One nigh ...
- POJ 2411 Mondriaan'sDream(状压DP)
题目大意:一个矩阵,只能放1*2的木块,问将这个矩阵完全覆盖的不同放法有多少种. 解析:如果是横着的就定义11,如果竖着的定义为竖着的01,这样按行dp只需要考虑两件事儿,当前行&上一行,是不 ...
- POJ 3311 Hie with the Pie (状压DP)
dp[i][j][k] i代表此层用的状态序号 j上一层用的状态序号 k是层数&1(滚动数组) 标准流程 先预处理出所有合法数据存在status里 然后独立处理第一层 然后根据前一层的max推 ...
- POJ 1321 棋盘问题(DFS & 状压DP)
用DFS写当然很简单了,8!的复杂度,16MS搞定. 在Discuss里看到有同学用状态压缩DP来写,就学习了一下,果然很精妙呀. 状态转移分两种,当前行不加棋子,和加棋子.dp[i][j]中,i代表 ...
- POJ:1185-炮兵阵地(状压dp入门)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组 ...
- poj 2404 中国邮递员问题 欧拉回路判定+状压dp
/* 状压dp 邮递员问题:求经过任意点出发经过每一条边一次并回到原点. 解法:1.如果是欧拉回路那么就是所有的边的总和. 2.一般的解法,找出所有的奇度顶点,任意两个顶点匹配,即最小完美匹配,可用状 ...
随机推荐
- X.509,RSA,PKCS 普及
X.509 X.509是一种非常通用的证书格式.所有的证书都符合ITU-T X.509国际标准,因此(理论上)为一种应用创建的证书可以用于任何其他符合X.509标准的应用. 在一份证书中,必须证明公钥 ...
- Eclipse右下角一直提示Computing additional info解决办法
今天不知道按了什么,发现Eclipse右下角一直提示computing additional info,打开progress,里面同时有好几条一样的信息,但是一直也执行不完,上网查找方案,发现原来是用 ...
- servlet学习笔记_2
一.Servlet线程安全问题1.servlet的线程安全问题.servlet引擎采用多线程的模式运行,它为并发的每个访问请求都预备一个线程来相应,但是由于只有一个servlet对象,因此,如果多个线 ...
- css3 transition动画
CSS3: 一.transition: <property> <duration> <animation type> <delay> eg: .div{ ...
- iOS —— 字典遍历排序
字典NSDictionary一般的遍历方法都是: NSArray* arr = [yourdictonary allKeys]; for(NSString* str in arr) { NSLog(& ...
- flask+html selected 根据后台数据设定默认值
先给代码 <script> $("#selector_political_status").val('{{ archive.political_status }}'); ...
- html中给表格添加斜线
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Linux下解压文件
unzip + 文件名 (解压.zip文件到当前目录) gunzip –c filename.gz > filename (解压.gz文件到当前目录,保留原文件) tar -zxvf - ...
- Fragment:关于Avoid non-default constructors in fragments的错误
在android开发中,写了一个关于继承Fragment的类时,如果有重载构造函数时,会提示“Avoid non-default constructors in fragments: use a de ...
- #pragma pack(push,1)与#pragma pack(1)的区别
这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n) 作用:C编译器将按照n个字节对 ...