链接: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 行所有铺满为答案。

代码:

  1. /*
  2. ID: wuqi9395@126.com
  3. PROG:
  4. LANG: C++
  5. */
  6. #include<map>
  7. #include<set>
  8. #include<queue>
  9. #include<stack>
  10. #include<cmath>
  11. #include<cstdio>
  12. #include<vector>
  13. #include<string>
  14. #include<fstream>
  15. #include<cstring>
  16. #include<ctype.h>
  17. #include<iostream>
  18. #include<algorithm>
  19. #define INF (1<<30)
  20. #define PI acos(-1.0)
  21. #define mem(a, b) memset(a, b, sizeof(a))
  22. #define rep(i, n) for (int i = 0; i < n; i++)
  23. #define debug puts("===============")
  24. #define eps (1e-6)
  25. typedef long long ll;
  26. using namespace std;
  27. const int maxn = 13;
  28. int w, h, cnt;
  29. ll dp[13][2100];
  30. int sta[14000][2];
  31. void dfs(int l, int now, int pre) {
  32. if (l > w) return ;
  33. if (l == w) {
  34. sta[cnt][0] = pre, sta[cnt++][1] = now;
  35. return ;
  36. }
  37. dfs(l + 2, (now << 2) | 3, (pre << 2) | 3);
  38. dfs(l + 1, (now << 1) | 1, pre << 1);
  39. dfs(l + 1, now << 1, (pre << 1) | 1);
  40. }
  41. int main () {
  42. while(~scanf("%d%d", &h, &w), h || w) {
  43. if (h < w) swap(h, w);
  44. cnt = 0;
  45. dfs(0, 0, 0);
  46. memset(dp, 0, sizeof(dp));
  47. dp[0][(1 << w) - 1] = 1;
  48. rep(i, h) {
  49. rep(j, cnt) {
  50. dp[i + 1][sta[j][1]] += dp[i][sta[j][0]];
  51. }
  52. }
  53. printf("%lld\n", dp[h][(1 << w) - 1]);
  54. }
  55. return 0;
  56. }

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

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. 【Android先进】查看手机记忆库状态和应用方法

    一世 我们知道.android程序存储器通常被限制16M.当然,24M的,和android程序存储器分为2部分:native和dalvik.dalvik 就是我们寻常说的java堆.我们创建的对象是在 ...

  2. 重新想象 Windows 8 Store Apps (22) - 文件系统: 访问文件夹和文件, 通过 AQS 搜索本地文件

    原文:重新想象 Windows 8 Store Apps (22) - 文件系统: 访问文件夹和文件, 通过 AQS 搜索本地文件 [源码下载] 重新想象 Windows 8 Store Apps ( ...

  3. Git相关操作汇总

    git clone: 正如上图,当我们打开终端的情况下,默认我们所在的目录是在/home/shiyanlou的,大家可以在终端输入以下命令把目录切换到桌面cd  /home/Desktop这个时候输入 ...

  4. 上curl java 模拟http请求

    最近,我的项目要求java模拟http请求,获得dns解决 tcp处理过的信息特定的连接. java api提供urlConnection apache提供的httpClient都不能胜任该需求,二次 ...

  5. MVC下判断用户登录和授权状态方法

    MVC下判断用户登录和授权状态方法 在我们日常开发的绝大多数系统中,都涉及到管理用户的登录和授权问题.登录功能(Authentication),针对于所有用户都开放:而授权(Authorization ...

  6. POJ 1659 Frogs&#39; Neighborhood(度序列组成)

    意甲冠军  中国 依据Havel-Hakimi定理构图即可咯  先把顶点按度数从大到小排序  可图的话  度数大的顶点与它后面的度数个顶点相连肯定是满足的  出现了-1就说明不可图了 #include ...

  7. SharePoint使用BCS开发你第一个应用程序(三)

    SharePoint使用BCS开发你第一个应用程序(三) 创建外部内容类型.         创建外部内容类型有三种不同方式: 1. 在记事本上手写XML代码(不推荐). 2. 使用SharePoin ...

  8. Oracle listener lsnrctl

    lsnrctl(Listener Control)是一家SQL*Net具,用于控制数据库listener,此工具提供了控制命令listener开端.停止,查看listener状态,更改listener ...

  9. 重写TextBox实现显示提示信息

    /// <summary> /// TextBox提示信息 /// </summary> /// <author>Tim_et</author> /// ...

  10. C# 字段、属性、成员变量

    引言: C#与java,C++中的这些基本概念略有不同. 由于easy混淆,所以这里总结下差别. 希望能对刚開始学习的人有帮助! 一.定义与作用 1.字段(field):是C#类级别定义的,和方法同一 ...