思路:状态压缩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. shopnc 商城源码阅读笔记-缓存技术

    缓存方式 : 从 shopnc 的缓存驱动目录 /framework/cache里已有的实现类来看,shopnc支持以下5种缓存方式 apc Eaccelerator file memcache xc ...

  2. 使用PHP导出Word文档的原理和实例

    PHP操作Word文档的方法有很多,这里再为大家提供一种方法. 原理   一般,有2种方法可以导出doc文档,一种是使用com,并且作为php的一个扩展库安装到服务器上,然后创建一个com,调用它的方 ...

  3. NFS挂载及写入故障

    最近在做架构时,分离出来一台图片服务器,图片服务器是通过NFS(网络文件系统)给两台web服务器提供图片存储的,在编辑NFS配置文件(/etc/exports)时:想了一下,允许访问NFS共享目录的范 ...

  4. Python 基础篇:字符编码、函数

    字符编码 在python2默认编码是ASCII, python3里默认是utf-8 unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so ...

  5. 七,WPF的元素绑定

    数据绑定是一种关系,该关系告诉WPF从一个源对象提取一些信息,并使用这些信息设置目标对象的属性,目标属性总是依赖项属性,然而,源对象可以是任何内容. 源对象是WPF元素并且源属性是依赖项属性的数据绑定 ...

  6. uCGUI窗口操作要点

    uCGUI窗口操作要点 1. 创建一个窗口的时候,会给此窗口发送“创建(WM_CREATE)”消息,从而执行它的回调函数:如果创建窗口的标志带有“可视标志(WM_CF_SHOW)”,那么在后续执行GU ...

  7. linux dump 命令详解

    功能说明:备份文件系统. 语 法:dump [-cnu][-0123456789][-b <区块大小>][-B <区块数目>][-d <密度>][-f <设备 ...

  8. IntelliJ IDEA 13怎么创建JAVA SE项目

    如下图,直接下一步,如果需要的话可以选择建立Main函数:

  9. java this 隐式参数

    第37级 this 是隐式参数, 类的方法调用时,会系统自动传递一个this的参数给方法.(这个参数是隐式传递的) 所以在方法里可以使用this这个参数. this在方法中表示对象. this(参数列 ...

  10. bulkTransfer通讯必须注意的问题:bulk buffer size(16K)

    Android USB host与HID使用bulkTransfer通讯接收和发送的数据长度不会超过16384,这个问题困扰了我很长一段时间,终于发现问题所在,不是出在我的程序设计,也不是硬件的发送/ ...