思路:状态压缩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. C#关于编码、解码相关问题

    编码.解码技术是我们在程序中开发中经常使用到的,对一些敏感信息的存储,比如密码之类的,我们一般是不会直接以明文直接存储到数据库的,而是会通过各种算法,可以是现成的MD5(一种散列算法).或者是Hash ...

  2. 用javascript快速清空你的人人时间轴、状态和分享

    博客已经迁移到www.imyzf.com,本站不再更新,请谅解! 现在玩人人的人越来越少了,很多人担心不玩以后东西放上面不安全..我也有同样的想法,但是手动删除上百条东西,太累了,于是写了些javas ...

  3. 解决IE 下div与img重叠无法触发鼠标事件的问题

    在IE下当我想在img标签上层显示一个div元素时,此时如果该div的background为空白(没有设置图片.或者颜色填充),会导致该div的鼠标事件失效:如果设置border为1px solid ...

  4. 即时Web通信总结

    即时Web通信在一些对数据实时性要求特别严格的应用中十分重要,如监控系统.报价系统.股票交易系统和即时在线聊天应用等,由于http协议设计当初是为了服务器端响应客户端的请求而设计的,只能在客户端主动发 ...

  5. vb delphi7、2010 csharp vb.net空白测试程序

    工作中难免在网上看到一段不错的代码,希望能够拿来测试一次,为了避免每次测试都要新建一个空白测试程序,索性预先建立好,要用的时候复制一遍,然后打开直接粘贴需要测试的代码进行测试.

  6. 一些SVN 地址

    lockbox3 地址: https://svn.code.sf.net/p/tplockbox/code/trunc indy10 地址:https://svn.atozed.com:444/svn ...

  7. C# 格式化字符串(转载)

    1 前言 如果你熟悉Microsoft Foundation Classes(MFC)的CString,Windows Template Library(WTL)的CString或者Standard ...

  8. python 内建函数 str() 和 repr() 的区别

    1.内建函数str()和repr() 或反引号操作符(``)可以方便地以字符串的方式获取对象的内容.类型.数值属性等信息. 2.str()函数得到的字符串可读性好(故被print调用) 3.repr( ...

  9. 求解 s = (1*1)!+(2*2)! + (3*3)!+...+(n*n)! (C语言)

    提示:定义函数可以求阶乘,再定义函数求阶乘之和.1和0的阶乘是1,n(n > 1)的阶乘是n * (n-1) * (n - 2) * … * 1 //采用了函数嵌套调用和函数递归调用 //求解阶 ...

  10. 解决ubuntu无法调整和保存屏幕亮度的问题

    整理自解决ubuntu无法调整和保存屏幕亮度的问题 ubuntu无法调整屏幕亮度,对笔记本来说很耗电,同时也很刺眼,因为它是默认以最大亮度来工作的. 所谓的调整,方法为下面的其中一种: 1.Fn+左右 ...