题目传送门

这道题暑假做的时候太模糊了,以前的那篇题解大家就别看了==。今天再复习状压感觉自己当时在写些什么鸭...。

题目大意:给你一个\(n\)*\(m\)的棋盘和许多\(1*2\)的骨牌,骨牌可以竖放或横放,问有多少种方案将骨牌铺满。

设计状态,\(f[i][j]\)表示当前在第\(i\)行,之前的所有行都已经铺满,当前行的状态为\(j\)的方案数。如果我们对01串的定义仍确定为1为放了0为没放,那么真的对嘛?

好像不行,存出不了那么多信息。我们试着改变0和1的含义。因为骨牌要么是横放要么是竖放,那么我们设第\(k\)位为1是一个竖矩形的上面一半,为0代表其他情况。

考虑转移,第\(i-1\)行能转移到第\(i\)行当且仅当①这一行状态与上一行状态与运算为0.(保证了每个数字为1的位下面一定为0,以继续补全)。②两行状态或运算后的二进制表示,连续的0长度必须为偶数,表示横放。

于是我们可以预处理出所有横放的情况,再进行\(O(4^m*n)\)的转移。目标状态\(f[n][0]\)。

把01的含义改变的思想妙啊。

#include<cstdio>
#include<algorithm>
#include<cstring> using namespace std;
typedef long long ll; int n,m,fake;
ll f[12][4200000];
bool qwq[4200000]; int main()
{
while(scanf("%d%d",&n,&m)!=EOF&&n!=0)
{
fake=(1<<m)-1;
// for(int i=0;i<=fake;i++)
// if(check(i)) qwq[i]=1;
for(int i=0;i<=fake;i++)
{
bool cnt=0,has_odd=0;
for(int j=0;j<m;j++)
if((i>>j)&1) has_odd|=cnt,cnt=0;
else cnt^=1;
qwq[i]=has_odd | cnt ? 0 : 1;
}
f[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<=fake;j++)
{
f[i][j]=0;
for(int k=0;k<=fake;k++)
{
if(j&k) continue;
if(!qwq[j|k]) continue;
f[i][j]+=f[i-1][k];
}
}
printf("%lld\n",f[n][0]);
}
return 0;
}

POJ 2411 Mondriaan's Dream 【状压Dp】 By cellur925的更多相关文章

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

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

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

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

  3. POJ 2411 Mondriaan's Dream ——状压DP 插头DP

    [题目分析] 用1*2的牌铺满n*m的格子. 刚开始用到动规想写一个n*m*2^m,写了半天才知道会有重复的情况. So Sad. 然后想到数据范围这么小,爆搜好了.于是把每一种状态对应的转移都搜了出 ...

  4. POJ 2411 Mondriaan'sDream(状压DP)

    题目大意:一个矩阵,只能放1*2的木块,问将这个矩阵完全覆盖的不同放法有多少种. 解析:如果是横着的就定义11,如果竖着的定义为竖着的01,这样按行dp只需要考虑两件事儿,当前行&上一行,是不 ...

  5. [poj2411] Mondriaan's Dream (状压DP)

    状压DP Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One nigh ...

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

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

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

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

  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)

    题意:有一个n*m的棋盘,要求用1*2的骨牌来覆盖满它,有多少种方案?(n<12,m<12) 思路: 由于n和m都比较小,可以用轮廓线,就是维护最后边所需要的几个状态,然后进行DP.这里需 ...

  10. POJ 2411 Mondriaan's Dream 插头dp

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

随机推荐

  1. centos下安装wordpress

    https://www.jianshu.com/p/2439dc2187b2 https://blog.csdn.net/liuhelong/article/details/79924014

  2. 用户态文件系统fuse学习【转】

    本文转载自:https://blog.csdn.net/ty_laurel/article/details/51685193 FUSE概述 FUSE(用户态文件系统)是一个实现在用户空间的文件系统框架 ...

  3. JS继承的实现方式

    JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一.那么如何在JS中实现继承呢?让我们拭目以待. JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如下: // 定义一个动物类 ...

  4. 9.1 NOIP普及组试题精解(3)

    9-6 seat.c #include <stdio.h> #define MAXN 1001 void swap(int *a, int *b) //交换数据 { int t; t = ...

  5. 左侧浮动html网页模板

    左侧浮动html网页模板是一款左侧导航菜单随网页滚动的html网站模板. 地址:http://www.huiyi8.com/sc/10617.html

  6. 四连测Day4

    四连爆炸 卡我常数 好像被AluminumGod拉到了创客...哇我这个天天爆炸的水平可能会被其他三位dalao吊起来打 orz Edmond-Karp_XiongGod orz Deidara_Wa ...

  7. 理解I/O Completion Port(完成端口)

    欢迎阅读此篇IOCP教程.我将先给出IOCP的定义然后给出它的实现方法,最后剖析一个Echo程序来为您拨开IOCP的谜云,除去你心中对IOCP的烦恼.OK,但我不能保证你明白IOCP的一切,但我会尽我 ...

  8. bzoj 2946 公共串 —— 后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2946 建出 n-1 个后缀自动机一起跑呗. 代码如下: #include<cstdio ...

  9. 洛谷 P3804 [模板] 后缀自动机

    题目:https://www.luogu.org/problemnew/show/P3804 模仿了一篇题解,感觉很好写啊. 代码如下: #include<cstdio> #include ...

  10. C# Linq 取得两个列表的交集

    我们经常会用到linq 来查询 一个数组中和另一个数组中相同的项, 这个时候就会用到IEqualityComparer接口. public class StudyInfoModel {      pu ...