传送门 >Here<

题意:用1*2的砖块铺满n*m的地板有几种方案

思路分析

  状压经典题!

  我们以$f[i][j]$作为状态,表示第i行之前全部填完并且第i行状态为j(状压)时的方案数。

  我们考虑,对于一个格子,一块砖有3种方法。

  (一):横着放。对下一行没有任何影响

  (二):竖着放,并且当前这一格作为砖块的下层。那么对下一行也没有任何影响

  (三):竖着放,并且当前这一格作为砖块的上层。这种情况对下一行很明显是有影响的。

  综上,只有情况3是对下一行有影响的。

  所以我们需要一种方法来区分前两种情况和第三种情况。

  对于第一种情况,我们把横着的两个位置都染上1,第二种情况的所在格子染成1。唯有第三种情况的时候把当前格子染成0.

  所以基本思路就有了,枚举行,然后枚举上下两个状态进行状态转移。如果这两种状态能够吻合(即不冲突),就累计方案数。

  那么怎么进行判断是否冲突呢?

  首先,一上一下不能再同一个位置出现0——因为这就意味着有两个竖放砖块的上层。

  另外,如果一上一下都是1,意味着是两个横放砖块——相邻的两个格子也必须是1.

  这样做单独一个的复杂度是4千万左右不会爆,但是考虑到题目有多组询问……打表就好了。

Code

  这个代码是表的生成器。

/*By QiXingzhi*/
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
#define int ll
const int N = ;
const int INF = ;
int h,w,lim;
int f[][N];
inline bool Check(int lst, int cur, int m){
for(int i = ; i < m;){
if(!(lst & ( << (i))) && !(cur & ( << (i)))) return ;
else if((lst & ( << (i))) && (cur & ( << (i)))){
if((lst & ( << (i+))) && (cur & ( << (i+)))){ i += ; continue; }
else return ;
}
else{ ++i; continue; }
}
return ;
}
inline int solve(int n, int m){
memset(f, , sizeof(f));
lim = ((<<(m))-);
f[][lim] = ;
for(int i = ; i <= n; ++i)
for(int j = ; j <= lim; ++j)
if(i == ){ if(Check(lim, j, m)) ++f[][j]; }
else{ for(int k = ; k <= lim; ++k) if(Check(k, j, m)) f[i][j] += f[i-][k]; }
return f[n][lim];
}
main(){
while(){
scanf("%d %d", &h, &w);
if(!h && !w) break;
if((h & ) && (w & )){ printf("0\n"); continue; }
printf("%lld\n",solve(h,w));
}
return ;
}

☆ [POJ2411] Mondriaan's Dream 「状压DP」的更多相关文章

  1. [Poj2411]Mondriaan's Dream(状压dp)(插头dp)

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 18096   Accepted: 103 ...

  2. poj2411 Mondriaan's Dream[简单状压dp]

    $11*11$格子板上铺$1*2$地砖方案.以前做过?权当复习算了,毕竟以前学都是浅尝辄止的..常规题,注意两个条件:上一行铺竖着的则这一行同一位一定要铺上竖的,这一行单独铺横的要求枚举集合中出现连续 ...

  3. POJ2411 Mondriaan's Dream 【状压dp】

    没错,这道题又是我从LZL里的博客里剽过来的,他的题真不错,真香. 题目链接:http://poj.org/problem?id=2411 题目大意:给一个n * m的矩形, 要求用 1 * 2的小方 ...

  4. poj2411 Mondriaan's Dream【状压DP】

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 20822   Accepted: 117 ...

  5. poj2411 Mondriaan's Dream (状压dp+多米诺骨牌问题)

    这道题的解析这个博客写得很好 https://blog.csdn.net/shiwei408/article/details/8821853 大致意思就是我们可以只处理两行之间的关系,然后通过这两个关 ...

  6. 「状压DP」「暴力搜索」排列perm

    「状压DP」「暴力搜索」排列 题目描述: 题目描述 给一个数字串 s 和正整数 d, 统计 sss 有多少种不同的排列能被 d 整除(可以有前导 0).例如 123434 有 90 种排列能被 2 整 ...

  7. 「BZOJ 5010」「FJOI 2017」矩阵填数「状压DP」

    题意 你有一个\(h\times w\)的棋盘,你需要在每个格子里填\([1, m]\)中的某个整数,且满足\(n\)个矩形限制:矩形的最大值为某定值.求方案数\(\bmod 10^9+7\) \(h ...

  8. POJ 题目2411 Mondriaan's Dream(状压DP)

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 13519   Accepted: 787 ...

  9. POJ 2411 Mondriaan's Dream 【状压Dp】 By cellur925

    题目传送门 这道题暑假做的时候太模糊了,以前的那篇题解大家就别看了==.今天再复习状压感觉自己当时在写些什么鸭.... 题目大意:给你一个\(n\)*\(m\)的棋盘和许多\(1*2\)的骨牌,骨牌可 ...

随机推荐

  1. 网络拓扑自动发掘之三层设备惯用的SNMP OID的含义

    原文地址:https://blog.csdn.net/maty_wang/article/details/81305070 1. ipNetToMediaIfIndex Name/OID: ipNet ...

  2. OO博客作业1:第1-3周作业总结

    (1)基于度量来分析自己的程序结构 注:UML图中每个划分了的圆角矩形代表一个类或接口,箭头可代表创建.访问数据等行为.类的图形内部分为3个部分,从上到下依次是类的名称.类包含的实例变量(属性).类实 ...

  3. 归并排序Python 实现

    一.归并排序   -归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分合策略(将问题分(divide)成一些小的问题然后递归求解,而合的阶段则将分的阶段得到的各答案&q ...

  4. Golang的类型断言

    类型断言即判断一个变量是不是某个类型的实例,这个经常用在判断接口的类型,基本的格式: y, ok := x.(type) 上面的语句用于判断变量x是不是type类型,有两种结果: x是type类型的变 ...

  5. ShowDoc上手

    ShowDoc是什么 每当接手一个他人开发好的模块或者项目,看着那些没有写注释的代码,我们都无比抓狂.文档呢?!文档呢?!Show me the doc !! 程序员都很希望别人能写技术文档,而自己却 ...

  6. 优化MySQL性能的几种方法-总结

    原文:http://bbs.landingbj.com/t-0-245601-1.html 1.要选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越 小,在它上 ...

  7. Arrays.copyOf() 和 System.arrayCopy()分析

    java数组的拷贝四种方法:for.clone.System.arraycopy.Arrays.copyof public class Test1 { public static void main( ...

  8. Oracle字符函数length substr concat实例

    --字符函数 --伪表dual --(1)求字符串长度 select length('123.456/-*') from dual --(2)截取函数求字符串的子串 ,) from dual --(3 ...

  9. js尾递归函数

    普通递归: function fac(n) { if (n === 1) return 1; return n * fac(n - 1); } fac(5) // 120 这是个阶乘.但是占用内存,因 ...

  10. linux audit审计(8)--开启audit对系统性能的影响

    我们使用测试性能的工具,unixbench,它有一下几项测试项目: Execl Throughput 每秒钟执行 execl 系统调用的次数 Pipe Throughput 一秒钟内一个进程向一个管道 ...