题意:有一个n*m的棋盘,要求用1*2的骨牌来覆盖满它,有多少种方案?(n<12,m<12)

思路:

  由于n和m都比较小,可以用轮廓线,就是维护最后边所需要的几个状态,然后进行DP。这里需要维护的状态数就是min(n,m)。即大概是一行的大小。每次放的时候,只考虑(1)以当前格子为右方,进行横放;(2)以当前格子为下方进行竖放;(3)还有就是可以不放。

  3种都是不一样的,所以前面的一种状态可能可以转为后面的几种状态,只要满足了条件。条件是,横放时,当前格子不能是最左边的;竖放时,当前格子不能是最上边的。而且要放的时候,除了当前格子,另一个格子也是需要为空才行的。

 //#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#define pii pair<int,int>
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int N=1e5+;
LL dp[][<<]; LL cal(int n,int m)
{
if(n<m) swap(n,m);
memset(dp, , sizeof(dp));
dp[][(<<m)-]=;
int cur=;
int h=(<<(m-));
for(int i=; i<n; i++)
{
for(int k=; k<m; k++)
{
cur^=;
memset(dp[cur], , sizeof(dp[cur]));
for(int j=; j<(<<m); j++)
{
if( j&h ) dp[cur][(j^h)<<]+=dp[cur^][j]; //最高位为1时,可以不放
if( k && !(j&) && (h&j)) dp[cur][((j&(h-))<<)|]+=dp[cur^][j]; //放横,左边为0,上面为1
if( i && !(h&j) ) dp[cur][(j<<)|]+=dp[cur^][j]; //放竖,上面为0
}
}
}
return dp[cur][(<<m)-];
} int main()
{
freopen("input.txt", "r", stdin);
int n, m;
while(scanf("%d%d",&n,&m), n+m) printf("%lld\n", cal(n,m));
return ;
}

AC代码

  UVA一样的题:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33787

 //#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#define pii pair<int,int>
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int N=;
LL dp[][<<N]; LL cal(int n,int m)
{
if(n<m) swap(n,m);
memset(dp, , sizeof(dp));
dp[][(<<m)-]=;
int cur=, h=(<<(m-));
for(int i=; i<n; i++)
{
for(int k=; k<m; k++)
{
cur^=;
for(int j=; j<(<<m); j++) dp[cur][j]=;
for(int j=; j<(<<m); j++)
{
if( j&h ) dp[cur][(j^h)<<]+=dp[cur^][j]; //最高位为1时,可以不放
if( k && !(j&) && (h&j)) dp[cur][((j&(h-))<<)|]+=dp[cur^][j]; //放横,左边为0,上面为1
if( i && !(h&j) ) dp[cur][(j<<)|]+=dp[cur^][j]; //放竖,上面为0
}
}
}
return dp[cur][(<<m)-];
} int main()
{
//freopen("input.txt", "r", stdin);
int n, m;
while(~scanf("%d%d",&n,&m)) printf("%lld\n", cal(n,m));
return ;
}

AC代码

poj 2411 Mondriaan's Dream (轮廓线DP)的更多相关文章

  1. poj 2411 Mondriaan's Dream 轮廓线dp

    题目链接: http://poj.org/problem?id=2411 题目意思: 给一个n*m的矩形区域,将1*2和2*1的小矩形填满方格,问一共有多少种填法. 解题思路: 用轮廓线可以过. 对每 ...

  2. POJ 2411 Mondriaan's Dream 插头dp

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

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

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

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

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

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

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

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

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

  7. [poj 2411]Mondriaan's Dream (状压dp)

    Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 18903 Accepted: 10779 D ...

  8. Mondriaan's Dream 轮廓线DP 状压

    Mondriaan's Dream 题目链接 Problem Description Squares and rectangles fascinated the famous Dutch painte ...

  9. [POJ] 2411 Mondriaan's Dream

    Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 18903 Accepted: 10779 D ...

  10. POJ2411 Mondriaan's Dream 轮廓线dp

    第一道轮廓线dp,因为不会轮廓线dp我们在南京区域赛的时候没有拿到银,可见知识点的欠缺是我薄弱的环节. 题目就是要你用1*2的多米诺骨排填充一个大小n*m(n,m<=11)的棋盘,问填满它有多少 ...

随机推荐

  1. python--numpy模块、spicy模块、 matplotlib模块

    一:numpy模块 ndarray:存储单一数据类型的多维数组 ufunc:能够对数组进行处理的函数(universal function object) #numpy 中arange用法,指定开始值 ...

  2. eclispe的使用

    1.eclipse 有的时候,子类包都已经写了,这时候要添加一个父类包,如果在包结构下是添加不了的,这时候需要切换格式:    

  3. 天天连萌UE分析

    1.开始游戏消耗心,有消耗动画,[可以使用到副本次数上] 2.关卡结束,是个可爱的动画,[可以是潇洒的动画,一个吹箫的潇洒老翁或者帅哥] 3.点击爽快感:点击配对成功飘字及时且快速,[字体漂亮--潇洒 ...

  4. PhpStorm插件之Api Debugger

    安装插件 File->Setting->Pluugins   搜索  Api Debugger 如何使用 安装完插件后,RESTART IDE,在编辑器右侧 即可找到最新安装的 Api D ...

  5. TP5之发送邮件

    1.下载扩展,vendor\phpmailer 文件结构: 2.话不多说,上代码    注意点: ·   需要提前开通对应邮箱的SMTP服务 ·  $mail->Host = "  & ...

  6. Lightoj1015【基础题】

    题意: 计算输入数>0的所有和: 思路: 直接干... #include<cstdio> #include<queue> #include<map> #inc ...

  7. HDU5920【模拟】

    模拟题这种东西啊~就是自己读题,自己打,没有别的方法...贴份6000+b的code跑: #include <bits/stdc++.h> using namespace std; //t ...

  8. [HNOI2010] 平面图判定 planar

    标签:二分图判定.题解: 首先可以把题目中给你的那个环给画出来,这样就可以发现对于任意一个图来说,如果两条边要相交,就不能让他们相交,那么这两条边就要一条在里面一条在外面,如果把环画成一条链,那么就是 ...

  9. SpringBoot2.0 整合 RocketMQ ,实现请求异步处理

    一.RocketMQ 1.架构图片 2.角色分类 (1).Broker RocketMQ 的核心,接收 Producer 发过来的消息.处理 Consumer 的消费消息请求.消息的持 久化存储.服务 ...

  10. angularJs自定义指令(directive)实现滑块滑动

    最近老大让我一个效果实现在页面某一部分内滑块随着滚动条上下滑动,说明一下我们项目使用技术angularJs.大家都知道,使用jquery很好实现. 那么angular如何实现呢,我用的是自定义指令(d ...