题意:给一块n×m的空地,用1×2的砖铺,有多少种方案。

解法:状压dp。考虑dp[i][j]表示前i - 1行都铺满时第i行的状态为j时的方案数。对于第i行,每个格子上是否有砖用0和1表示,0表示不铺砖,1表示铺砖,二进制压缩状态,枚举第i - 1行的状态j和第i行的状态k,看这两种状态是否符合实际,如果符合实际,dp[i][k] += dp[i - 1][j]。因为在看第i行时要求i - 1行都铺满,所以j状态中0的位置k都必须是1,表示放一块2×1的砖,剩下的部分如果k的位置是1,则是放了1×2的砖,所以每段1的长度必须是偶数。

我貌似判是否符合实际的地方写屎了……总之没T就好哈哈哈哈哈哈哈

还有两个剪枝是n×m如果是奇数则答案是0,因为一块砖的面积是2,另一个剪枝是选择n和m中小的作为列数,可以让状态小一些,另外将答案打表也可以减少时间,我本来想把状态之间是否符合实际也打表……后来意识到这样是错的。

还有就是int会爆……orz

代码:

  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<string>
  5. #include<string.h>
  6. #include<math.h>
  7. #include<limits.h>
  8. #include<time.h>
  9. #include<stdlib.h>
  10. #include<map>
  11. #include<queue>
  12. #include<set>
  13. #include<stack>
  14. #include<vector>
  15. #include<iomanip>
  16. #define LL long long
  17. #define lson l, m, rt << 1
  18. #define rson m + 1, r, rt << 1 | 1
  19.  
  20. using namespace std;
  21.  
  22. int n, m;
  23. LL ans[15][15];
  24. LL dp[15][2050];
  25. bool judge(int x, int y)
  26. {
  27. int vis[20] = {0};
  28. for(int i = 0; i < m; i++)
  29. {
  30. if((x & (1 << i)) == 0)
  31. {
  32. vis[i] = 1;
  33. if((y & (1 << i)) == 0) return false;
  34. }
  35. }
  36. for(int i = 0; i < m - 1; i++)
  37. {
  38. if(vis[i] && (y & (1 << i))) continue;
  39. if(vis[i] && !(y & (1 << i))) return false;
  40. if(!vis[i] && (y & (1 << i)))
  41. {
  42. if(vis[i + 1]) return false;
  43. vis[i] = 1;
  44. vis[i + 1] = 1;
  45. }
  46. }
  47. if(vis[m - 1] && !(y & (1 << (m - 1)))) return false;
  48. if(!vis[m - 1] && (y & (1 << (m - 1)))) return false;
  49. return true;
  50. }
  51. LL solve()
  52. {
  53. memset(dp, 0, sizeof dp);
  54. dp[0][(1 << m) - 1] = 1;
  55. for(int i = 1; i <= n; i++)
  56. {
  57. for(int j = 0; j < (1 << m); j++)
  58. {
  59. for(int k = 0; k < (1 << m); k++)
  60. {
  61. if(judge(j, k)) dp[i][k] += dp[i - 1][j];
  62. }
  63. }
  64. }
  65. return dp[n][(1 << m) - 1];
  66. }
  67. int main()
  68. {
  69. while(~scanf("%d%d", &n, &m) && !(n == 0 && m == 0))
  70. {
  71. if((n * m) & 1)
  72. {
  73. puts("0");
  74. continue;
  75. }
  76. if(m > n) swap(n, m);
  77. if(ans[n][m])
  78. {
  79. cout << ans[n][m] << endl;
  80. continue;
  81. }
  82. ans[n][m] = solve();
  83. cout << ans[n][m] << endl;
  84. }
  85. return 0;
  86. }

  

  

POJ 2241 Mondriaan's Dream的更多相关文章

  1. [poj P2411] Mondriaan's Dream

    [poj P2411] Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 18023   A ...

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

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

  3. POJ 2411 Mondriaan's Dream 插头dp

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

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

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

  5. [POJ] 2411 Mondriaan's Dream

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

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

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

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

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

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

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

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

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

随机推荐

  1. win8,定时任务添加(schtasks)

    win8,64位,通过CMD命令schtasks,添加定时任务 以下内容,均来自 schtasks /? 和 schtasks /create /? // 1.schtasks /create 的参数 ...

  2. Android异步下载图片并且缓存图片到本地

    Android异步下载图片并且缓存图片到本地 在Android开发中我们经常有这样的需求,从服务器上下载xml或者JSON类型的数据,其中包括一些图片资源,本demo模拟了这个需求,从网络上加载XML ...

  3. Ibm-jQuery教程学习笔记

    一.概述 1.虽然 jQuery 本身并非一门新的语言.但是,学习其语法有助于我们熟练.灵活地使用它.回顾下我们熟悉的 CSS 语法,不难发现 jQuery 的语法与 CSS 有相似之处. jQuer ...

  4. linux驱动分离分层的概念

    这个分离分层的概念和输入子系统有点像,但不是完全一样的.为什么会再弄一个这个模型出来我也没有搞懂,现在我的学习还停留在把知识学懂的层面上.至于为什么会产生这种知识,现在我还无从解释,还需时日成长. 这 ...

  5. http://blog.csdn.net/hguisu/article/details/7533759

    http://blog.csdn.net/hguisu/article/details/7533759

  6. 利用Apriori算法对交通路况的研究

    首先简单描述一下Apriori算法:Apriori算法分为频繁项集的产生和规则的产生. Apriori算法频繁项集的产生: 令ck为候选k-项集的集合,而Fk为频繁k-项集的集合. 1.首先通过单遍扫 ...

  7. google 访问

    http://maolihui.com/goagent-detail.htmlgoagent教程详细版https://aiguge.xyz/chrome-goagent-proxy-switchyom ...

  8. ZOJ Problem Set - 3804 YY's Minions

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5336 比较简单的模拟题,题意也很好理解. #include <iostr ...

  9. 第八篇 EBS实现企业日常业务运管模型的解决方案设计思路

    常业务运管模型企业有大有小,各行各业,千差万别,但,其日常业务运管也有相通之处,以典型的制造企业为例,其日常业务运管模型如下图所示:       (1)企业日常业务运管模型在市场经济条件下,一个生产型 ...

  10. 收藏一些python的小技能

    例子1:For .. else 语法 foo=[2,1] for i in foo: if i == 0: break else: print("i was never 0") 例 ...