POJ 2411 Mondriaan's Dream
思路:状态压缩dp,如果在(i,j)位置横着放砖块,那么(i,j)和(i+1.j)都是1,如果竖着放砖块,那么(i,j)为0,(i,j+1)为1,这样每行就可以用一个整数来存放状态,设dp[i][j]为第i行为j状态时得摆放方案数,那么最终要求的结果就是dp[n][(1 << m)-1];
由于第i行如何摆放只受第i-1行状态的影响,所以状态转移方程为:dp[i][j] = sum(dp[i-1][k]),其中状态第i行的状态j和第i-1行的状态k应兼容,即不发生冲突。
下面说说具体兼容情形:
1,若(i,j)位置为1,那么{
(1)若(i-1,j为0,这块砖是竖着放,那么可能是兼容的,直接检查(i,j+1)位置;
(2)若(i-1,j)为1,那么这块砖必须横着放,因此(i,j+1)必须为1,并由此可得(i-1,j+1)也必须是1,若满足这些就检查(i,j+2)位置;
}
2,若(i,j)位置为0,那么{
(i-1,j)位置必须为1,因为不可能连续两个竖着放的砖块“头对头”,如果满足就直接检查(i,j+1)位置;
}
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long int
using namespace std;
const int MAXN = 15;
int n,m;
LL ans[MAXN][MAXN];
LL dp[MAXN][1 << 12];
bool init(int s){
for(int i = 0;i < m;){
if(s & (1 << i)){
if(i == m-1) return false;
if(s & (1 << (i+1))) i += 2;
else return false;
}else i++;
}
return true;
}
bool canPalce(int s1,int s2){
for(int i = 0;i < m;){
if(s1 & (1 << i)){
if(s2 & (1 << i)){
if(i == m-1 || !(s1&(1<<(i+1))) || !(s2&(1<<(i+1)))) return false;
i += 2;
}else i ++;
}else{
if(s2 & (1 << i)) i ++;
else return false;
}
}
return true;
}
void solve(int n,int m){
memset(dp,0,sizeof dp);
int range = (1 << m);
for(int i = 0;i < range;i ++)
if(init(i)) dp[1][i] = 1;
for(int i = 2;i <= n;i ++){
for(int j = 0;j < range;j ++){
for(int k = 0;k < range;k ++)
if(canPalce(j,k)) dp[i][j] += dp[i-1][k];
}
}
ans[n][m] = dp[n][range-1];
cout << ans[n][m] << endl;
}
int main(){
memset(ans,-1,sizeof ans);
while(~scanf("%d%d",&n,&m) && n+m){
if(n < m) swap(n,m);
if(ans[n][m] != -1){
cout << ans[n][m] << endl;
continue;
}else if(n*m & 1){
ans[n][m] = 0;
cout << 0 << endl;
continue;
}else solve(n,m);
}
}
POJ 2411 Mondriaan's Dream的更多相关文章
- POJ 2411 Mondriaan's Dream 插头dp
题目链接: http://poj.org/problem?id=2411 Mondriaan's Dream Time Limit: 3000MSMemory Limit: 65536K 问题描述 S ...
- 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)
一.Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, ...
- POJ - 2411 Mondriaan's Dream(轮廓线dp)
Mondriaan's Dream Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One nig ...
- [POJ] 2411 Mondriaan's Dream
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 18903 Accepted: 10779 D ...
- [poj 2411]Mondriaan's Dream (状压dp)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 18903 Accepted: 10779 D ...
- Poj 2411 Mondriaan's Dream(状压DP)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Description Squares and rectangles fascina ...
- poj 2411 Mondriaan's Dream(状态压缩dP)
题目:http://poj.org/problem?id=2411 Input The input contains several test cases. Each test case is mad ...
- poj 2411 Mondriaan's Dream(状态压缩dp)
Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, af ...
- poj 2411 Mondriaan's Dream 轮廓线dp
题目链接: http://poj.org/problem?id=2411 题目意思: 给一个n*m的矩形区域,将1*2和2*1的小矩形填满方格,问一共有多少种填法. 解题思路: 用轮廓线可以过. 对每 ...
随机推荐
- Chrome 浏览器各版本下载大全
随着最近64位版本的 Chrome 浏览器正式版的推出,Chrome 浏览器再次受到广大浏览迷的重点关注,今天我们就整理一下各版本的 Chrome 浏览器 32位及64位的下载地址,方便各位浏览迷选择 ...
- mysql存储过程讲解
1.数据库存储过程:简单滴说,存储过程就是存储在数据库中的一个程序. 2..数据库存储过程作用: 第一:存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快. 第二:存储过程可以接受参数.输出参 ...
- NGUI系列教程三
接下来我们再来看Progress Bar和Slider,对比参数我们可以发现,Progress Bar和slider的明显区别在于slider多一个Thumb选项,这里的Thumb就是我们拖动的时候点 ...
- Microsoft Visual Studio 2010 Service Pack 1(exe)
在线安装包:https://cid-3ca83445bd7767a0.office.live.com/browse.aspx/.Public/VS2010 ISO:http://download.mi ...
- android apk 反编译
Apk文件结构 apk文件实际是一个zip压缩包,可以通过解压缩工具解开.以下是我们用zip解开helloworld.apk文件后看到的内容.可以看到其结构跟新建立的工程结构有些类似. java代码: ...
- 如何使一个input文本框随其中内容而变化长度(转)
第一: <input type="text" onkeydown="this.onkeyup();" onkeyup="this.size=(t ...
- linux 查看各服务状态chkconfig
使用chkconfig 查看服务状态启动状态chkconfig --list 查看服务状态chkconfig --del <service name> 删除掉某项服务.在Fedora14中 ...
- bzoj 1133: [POI2009]Kon dp
1133: [POI2009]Kon Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 242 Solved: 81[Submit][Status][D ...
- php多线程thread开发与应用的例子
Php多线程的使用,首先需要PHP5.3以上版本,并安装pthreads PHP扩展,可以使PHP真正的支持多线程,扩展如何安装请自行百度 PHP扩展下载:https://github.com/kra ...
- Loadrunner负载机agent
记录下来备用,若要一台服务器充当负载机,windows下必须启动magentproc.exe