思路:状态压缩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的更多相关文章

  1. POJ 2411 Mondriaan's Dream 插头dp

    题目链接: http://poj.org/problem?id=2411 Mondriaan's Dream Time Limit: 3000MSMemory Limit: 65536K 问题描述 S ...

  2. POJ 2411 Mondriaan's Dream -- 状压DP

    题目:Mondriaan's Dream 链接:http://poj.org/problem?id=2411 题意:用 1*2 的瓷砖去填 n*m 的地板,问有多少种填法. 思路: 很久很久以前便做过 ...

  3. Poj 2411 Mondriaan's Dream(压缩矩阵DP)

    一.Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, ...

  4. POJ - 2411 Mondriaan's Dream(轮廓线dp)

    Mondriaan's Dream Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One nig ...

  5. [POJ] 2411 Mondriaan's Dream

    Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 18903 Accepted: 10779 D ...

  6. [poj 2411]Mondriaan's Dream (状压dp)

    Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 18903 Accepted: 10779 D ...

  7. Poj 2411 Mondriaan's Dream(状压DP)

    Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Description Squares and rectangles fascina ...

  8. poj 2411 Mondriaan's Dream(状态压缩dP)

    题目:http://poj.org/problem?id=2411 Input The input contains several test cases. Each test case is mad ...

  9. poj 2411 Mondriaan's Dream(状态压缩dp)

    Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, af ...

  10. poj 2411 Mondriaan's Dream 轮廓线dp

    题目链接: http://poj.org/problem?id=2411 题目意思: 给一个n*m的矩形区域,将1*2和2*1的小矩形填满方格,问一共有多少种填法. 解题思路: 用轮廓线可以过. 对每 ...

随机推荐

  1. Chrome 浏览器各版本下载大全

    随着最近64位版本的 Chrome 浏览器正式版的推出,Chrome 浏览器再次受到广大浏览迷的重点关注,今天我们就整理一下各版本的 Chrome 浏览器 32位及64位的下载地址,方便各位浏览迷选择 ...

  2. mysql存储过程讲解

    1.数据库存储过程:简单滴说,存储过程就是存储在数据库中的一个程序. 2..数据库存储过程作用: 第一:存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快. 第二:存储过程可以接受参数.输出参 ...

  3. NGUI系列教程三

    接下来我们再来看Progress Bar和Slider,对比参数我们可以发现,Progress Bar和slider的明显区别在于slider多一个Thumb选项,这里的Thumb就是我们拖动的时候点 ...

  4. Microsoft Visual Studio 2010 Service Pack 1(exe)

    在线安装包:https://cid-3ca83445bd7767a0.office.live.com/browse.aspx/.Public/VS2010 ISO:http://download.mi ...

  5. android apk 反编译

    Apk文件结构 apk文件实际是一个zip压缩包,可以通过解压缩工具解开.以下是我们用zip解开helloworld.apk文件后看到的内容.可以看到其结构跟新建立的工程结构有些类似. java代码: ...

  6. 如何使一个input文本框随其中内容而变化长度(转)

    第一: <input type="text" onkeydown="this.onkeyup();" onkeyup="this.size=(t ...

  7. linux 查看各服务状态chkconfig

    使用chkconfig 查看服务状态启动状态chkconfig --list 查看服务状态chkconfig --del <service name> 删除掉某项服务.在Fedora14中 ...

  8. bzoj 1133: [POI2009]Kon dp

    1133: [POI2009]Kon Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 242  Solved: 81[Submit][Status][D ...

  9. php多线程thread开发与应用的例子

    Php多线程的使用,首先需要PHP5.3以上版本,并安装pthreads PHP扩展,可以使PHP真正的支持多线程,扩展如何安装请自行百度 PHP扩展下载:https://github.com/kra ...

  10. Loadrunner负载机agent

    记录下来备用,若要一台服务器充当负载机,windows下必须启动magentproc.exe