链接:http://poj.org/problem?id=2411

题意:题目描写叙述:用1*2 的矩形通过组合拼成大矩形。求拼成指定的大矩形有几种拼法。

參考博客:http://blog.csdn.net/shiwei408/article/details/8821853

思路:我看了上面的博客,想了非常久才明确是怎样处理状态的。

因为是1 * 2,所以能够通过相邻两行的转化关系来推导。

两行铺不铺砖能够用二进制来表示,可是假设暴力枚举,大概有2^10 * 2 ^ 10 次那么多状态(尽管当中有非常多状态是没实用的)。

所以採用dfs来枚举各种可行状态:

状态标记 横放和竖放的下一个均为1。竖放的上一个和不放置为0 ,每行能够转化为1个2进制数。当这一行訪问结束时,就会得到上一行状态。和该行状态,由于全部情况都是我们设置的,所以pre状态一定会转化为now状态

对于每个位置,我们有三种放置方法:1. 竖直放置2. 水平放置3. 不放置

d为当前列号 ,初始化d, now, pre都为0。now为当前行。pre为当前行的上一行

1. d = d + 1, now << 1 | 1, pre << 1;   // 竖直放置。当前行该列为1,上一行该列置为0

2. d = d + 2, now << 2 | 3, pre<< 2 | 3;  // 横放 都为11(由于当两行的状态往下推时,必需要保证pre这一行摆满。所以pre也都为11)

3. d = d + 1, now << 1, pre<< 1 | 1;    // 上一行该列置为1,不能竖放。不放置的状态

由于转移状态有非常多种,所以用dfs去枚举各种可行的状态。

最后在转移的时候,dp[0][(1 << w) - 1] = 1 表示仅仅有第0行所有铺满才行。

仅仅须要算到 h - 1 行,然后 h 行所有铺满为答案。

代码:

/*
ID: wuqi9395@126.com
PROG:
LANG: C++
*/
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<fstream>
#include<cstring>
#include<ctype.h>
#include<iostream>
#include<algorithm>
#define INF (1<<30)
#define PI acos(-1.0)
#define mem(a, b) memset(a, b, sizeof(a))
#define rep(i, n) for (int i = 0; i < n; i++)
#define debug puts("===============")
#define eps (1e-6)
typedef long long ll;
using namespace std;
const int maxn = 13;
int w, h, cnt;
ll dp[13][2100];
int sta[14000][2];
void dfs(int l, int now, int pre) {
if (l > w) return ;
if (l == w) {
sta[cnt][0] = pre, sta[cnt++][1] = now;
return ;
}
dfs(l + 2, (now << 2) | 3, (pre << 2) | 3);
dfs(l + 1, (now << 1) | 1, pre << 1);
dfs(l + 1, now << 1, (pre << 1) | 1);
}
int main () {
while(~scanf("%d%d", &h, &w), h || w) {
if (h < w) swap(h, w);
cnt = 0;
dfs(0, 0, 0);
memset(dp, 0, sizeof(dp));
dp[0][(1 << w) - 1] = 1;
rep(i, h) {
rep(j, cnt) {
dp[i + 1][sta[j][1]] += dp[i][sta[j][0]];
}
}
printf("%lld\n", dp[h][(1 << w) - 1]);
}
return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

POJ 2411 Mondriaan&#39;s Dream (dp + 减少国家)的更多相关文章

  1. poj 2411 Mondriaan&#39;s Dream 【dp】

    题目:id=2411" target="_blank">poj 2411 Mondriaan's Dream 题意:给出一个n*m的矩阵,让你用1*2的矩阵铺满,然 ...

  2. POJ 2411 Mondriaan&#39;s Dream

    状压DP Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 9938 Accepted: 575 ...

  3. 状压DP POJ 2411 Mondriaan'sDream

    题目传送门 /* 题意:一个h*w的矩阵(1<=h,w<=11),只能放1*2的模块,问完全覆盖的不同放发有多少种? 状态压缩DP第一道:dp[i][j] 代表第i行的j状态下的种数(状态 ...

  4. POJ 2411 Mondriaan's Dream 插头dp

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

  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 链接:http://poj.org/problem?id=2411 题意:用 1*2 的瓷砖去填 n*m 的地板,问有多少种填法. 思路: 很久很久以前便做过 ...

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

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

  8. poj 2411 Mondriaan's Dream(状态压缩dp)

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

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

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

随机推荐

  1. ROW_NUMBER() OVER 排序函数的基本用法

    ROW_NUMBER() OVER 排序函数 select ROW_NUMBER() OVER (PARTITION BY guide_id ORDER BY pic_sort) as rowid,p ...

  2. 利用ffmpeg将H264解码为RGB

    因为公司买到了一个不提供解码器的设备,我不得已还要做解码的工作.在网上找了一圈,H264解码比較方便的也就是ffmpeg一系列的函数库了,原本设备中也是用这套函数库解码,但厂家不给提供,没办法,仅仅得 ...

  3. MessageBox()功能

    MessageBox()功能.这是一个非常频繁使用的Win32 API,在屏幕上显示一个窗体,提出问题,并等待用户输入.它的原型是 int MessageBox(HWND hwnd,LPCTSTR l ...

  4. ImportError with IronPython in C#

    I was using IronPython to execute python code inside my C# implementation lately, and I encountered ...

  5. ajax方式提交带文件上传的表单,上传后不跳转

    ajax方式提交带文件上传的表单 一般的表单都是通过ajax方式提交,所以碰到带文件上传的表单就比较麻烦.基本原理就是在页面增加一个隐藏iframe,然后通过ajax提交除文件之外的表单数据,在表单数 ...

  6. 左右xcode的重构选项的一些理解

    Rename(重命名):对标示符进行重命名,以获得更好的代码可读性,这些标示符包含类,方法或者函数的名称. Extract(抽取):将你在XCode种选择的代码抽取到一个新的方法或函数中. Creat ...

  7. Telnet,SSH1,SSH2,Telnet/SSL,Rlogin,Serial,TAPI,RAW

    一.Telnet 采用Telnet用来訪问远程计算机的TCP/IP协议以控制你的网络设备,相当于在离开某个建筑时大喊你的username和口令.非常快会有人进行监听, 并且他们会利用你安全意识的缺乏. ...

  8. 【Web探索之旅】第二部分第四课:数据库

    内容简介 1.第二部分第四课:数据库 2.第二部分第五课预告:响应式网站 第二部分第四课:数据库 说到“数据库”,顾名思义,是“数据的仓库”的意思. 所以数据库的一大作用就是储存数据咯. 为什么Web ...

  9. spring mvc 错误摘要--。位。

    1....identifier of an instance of org.szgzw.ent.profile.baseinfo.enterprise.EnterpriseEntity was alt ...

  10. unity3d中让物体显示和隐藏

    unity3d中让物体显示和隐藏的方法 gameObject.renderer.enabled //是控制一个物体是否在屏幕上渲染或显示  而物体实际还是存在的 仅仅是想当于隐身 而物体本身的碰撞体还 ...