AC传送门:http://vjudge.net/problem/POJ-2411

【题目大意】

有一个W行H列的广场,需要用1*2小砖铺盖,小砖之间互相不能重叠,问有多少种不同的铺法?

【题解】

对于每一行有w个位置,所以每一行都有0~2w-1种状态。

对于当前行的状态s,它是由前一行的状态s’转化过来的,显然,对于该行某个位置j:

如果前一行该位置为0,那么该位置可以竖放 即 0-> 1

如果前一行连续两个位置为0,那么这两个连续位置可以横放 即00-> 00

如果前一行该位置为1,显然该位置不能再放,于是应该把该位置设置为0 ,即1-> 0

/*************
poj 2411
by chty
2016.11.15
*************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<algorithm>
using namespace std;
#define FILE "read"
#define up(i,j,n) for(int i=j;i<=n;i++)
namespace INIT{
char buf[1<<15],*fs,*ft;
inline char getc() {return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;}
inline int read(){
int x=0,f=1; char ch=getc();
while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getc();}
while(isdigit(ch)) {x=x*10+ch-'0'; ch=getc();}
return x*f;
}
}using namespace INIT;
int n,m;
long long f[15][2500];
void dfs(int i,int s1,int s2,int next){
if(next>m) return;
if(next==m) f[i+1][s2]+=f[i][s1];
else if((s2&(1<<next))==0){
dfs(i,s1,s2|(1<<next),next+1);
if((s2&(1<<(next+1)))==0) dfs(i,s1,s2,next+2);
}
else dfs(i,s1,s2&~(1<<next),next+1);
}
int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
while(~scanf("%d%d",&n,&m)&&n&&m){
memset(f,0,sizeof(f)); f[1][0]=1;
up(i,1,n) up(j,0,(1<<m)-1) if(f[i][j]) dfs(i,j,j,0);
printf("%lld\n",f[n+1][0]);
}
return 0;
}

【poj2411】Mondriaan's Dream 状态压缩dp的更多相关文章

  1. POJ2411 - Mondriaan's Dream(状态压缩DP)

    题目大意 给定一个N*M大小的地板,要求你用1*2大小的砖块把地板铺满,问你有多少种方案? 题解 刚开始时看的是挑战程序设计竞赛上的关于铺砖块问题的讲解,研究一两天楞是没明白它代码是怎么写的,智商捉急 ...

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

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

  3. poj2411 Mondriaan's Dream (轮廓线dp、状压dp)

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

  4. poj 2411 Mondriaan's Dream_状态压缩dp

    题意:给我们1*2的骨牌,问我们一个n*m的棋盘有多少种放满的方案. 思路: 状态压缩不懂看,http://blog.csdn.net/neng18/article/details/18425765 ...

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

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

  6. POJ2411 Mondriaan's Dream 题解 轮廓线DP

    题目链接:http://poj.org/problem?id=2411 题目大意 给你一个 \(n \times m (1 \le n,m \le 11)\) 的矩阵,你需要用若干 \(1 \time ...

  7. 【POJ2411】Mondriaan's Dream(轮廓线DP)

    [POJ2411]Mondriaan's Dream(轮廓线DP) 题面 Vjudge 题解 这题我会大力状压!!! 时间复杂度大概是\(O(2^{2n}n^2)\),设\(f[i][S]\)表示当前 ...

  8. 状态压缩dp(hdu2167,poj2411)

    hdu2167 http://acm.hdu.edu.cn/showproblem.php?pid=2167 给定一个N*N的板子,里面有N*N个数字,选中一些数字,使得和最大 要求任意两个选中的数字 ...

  9. 状态压缩DP(大佬写的很好,转来看)

    奉上大佬博客 https://blog.csdn.net/accry/article/details/6607703 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的 ...

随机推荐

  1. mouseover、mouseout和mouseenter、mouseleave

    这里直接把<Javascript 高级程序设计(第三版)>中的解释贴出来: mouseover:在鼠标指针位于一个元素外部,然后用户将其首次移入另一个元素边界之内时触发.不能通过键盘触发这 ...

  2. HDU 4635

    http://acm.hdu.edu.cn/showproblem.php?pid=4635 问:最多加多少条边,使得原图不是强连通图 正向考虑有困难,不妨反向思考,既最少去掉几条边使得原图不是强连通 ...

  3. arcotg_udc: exports duplicate symbol imx_usb_create_charger (owned by kernel)

    /********************************************************************************* * arcotg_udc: exp ...

  4. POI2010题解

    POI2010题解 我也不知道我为什么就开始刷POI了 有些题目咕掉了所以不完整(我都不知道POI到底有多少题) [BZOJ2079][Poi2010]Guilds (貌似bz跟洛谷上的不是一个题?) ...

  5. 1106-冒泡算法C程序(语法树)

    #include <stdio.h> main() { int i,j,temp; int a[10]; for(i=0;i<10;i++) scanf ("%d,&quo ...

  6. visual studio内置“iis”组件提取及二次开发

    简介 visual studio安装后会自带小型的“iis”服务器,本文就简单提取一下这个组件,自己做一个小型“iis”服务器吧.先来说用途吧(废话可绕过),比如在服务器上没有安装iis,或者给客户演 ...

  7. AbstractBeanDefinition:lenientConstructorResolution属性源码分析

    版本:spring-framework-4.1 一概述 在看AbstractBeanDefinition源码时,注意到lenientConstructorResolution属性有诸多不疑,现在通过示 ...

  8. MySQL的WHERE语句中BETWEEN与IN的用法和他们的区别

    MySQL BETWEEN 用法 not可以对between...and取反. 1.数值型 BETWEEN 运算符用于 WHERE 表达式中,选取介于两个值之间的数据范围.BETWEEN 同 AND ...

  9. Spring Could 问题

    作为流行的微服务框架,Spring Could实用但不完美,比如说它只针对Java语言,坚持REST协议做微服务间的通讯等. Spring Cloud虽然集成了众多组件,可以构建一个完整的微服务应用, ...

  10. bzoj3191卡牌游戏

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3191 原本想模拟过程,从t个人推到1个人: 但是怎么转移呢?想状压,可是50位压不到角标里. ...