poj 2411 Mondriaan’s Dream(最清晰的状压DP解析)

闫氏DP大法好

我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样

摆放的小方格总方案数 等价于 横着摆放的小方格总方案数
遍历每一列,i列的方案数只和i-1列有关系

i - 1行的状态k能转移到第i行的状态j,当且仅当

  • j & k == 0, 即第i列和第i - 1列的每一行都没有连续两个横向棋子重叠放置
  • st[j | k] == true i - 1 即第i列和第i - 1列合并以后(要合并是因为第i列和第i - 1列都是两个空格子才行,一列有竖棋子的上半部分一列没有是不算的)的状态没有出现连续空格子为奇数个

状态表示 f[i][j]: 前i - 1列已经确定,且从第i - 1列伸出的小方格在第i列的状态为j 的方案数。属性:方案数取总和
状态计算:(限制条件:i - 1列非空白位置可以不能放置小方格),在i列不同的放置方法就是不同的集合划分。

#include<cstdio>
#include<algorithm>
#include<cstring>
typedef long long ll;
using namespace std;ll f[12][1 << 11];
bool vis[1 << 11];
int n, m, cnt;int main()
{while(~scanf("%d%d", &n, &m) && n + m){//我们一列一列地来for(int i = 0; i < (1 << n); ++ i){//先预处理合法状态vis[i] = true;//初始化cnt = 0;//初始化for(int j = 0; j < n; ++ j){//n行所以有n个状态if(i >> j & 1){//遇见了横着放的棋子if(cnt & 1){//此时空的格子(允许防止竖棋子的格子,必须是偶数因为竖棋子要连着占两格)如果为奇数个说明不合法vis[i] = false;//标记此状态不合法break;}}else cnt ++ ;//记录连续的空格子数,因为只需要知道是奇数还是偶数所以可以一直加}if(cnt & 1)vis[i] = false;//同理,如果最后的连续的空格子是奇数个说明也不合法}memset(f, 0, sizeof f);//多组数据清零f[0][0] = 1;for(int i = 1 ;i <= m; ++ i){for(int j = 0; j < (1 << n); ++ j){for(int k = 0; k < (1 << n); ++ k){if((j & k) == 0 && vis[j | k]){f[i][j] += f[i - 1][k];}}}}printf("%lld\n", f[m][0]);}return 0;
}

POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)相关推荐

  1. POJ 2411: Mondriaan's Dream

    题目链接:http://poj.org/problem?id=2411 题意: 用1*2的骨牌填充一个n*m的网格. 求方案数. 算法: 这道题用普通的状态压缩DP的话,打表也可以过. 也就是用一个m ...

  2. POJ 2411 Mondriaan's Dream [经典状态压缩dp]

    题意:略. 思路:这一题开始做的时候完全没有思路,便去看了别人的题解. 首先,对于这个题目解法想有一个初步的了解,请看这里:http://www.2cto.com/kf/201208/146894.h ...

  3. POJ - 2411 Mondriaan's Dream(状压dp)

    题目链接:点击查看 题目大意:铺瓷砖 题目分析:经典之经典的状态压缩动态规划,具体的懒得说了,怠惰ing..一个月之前写的代码,还好当时注释做的好,现在稍微一看就能立马理解,码到博客上存着吧,三种方法 ...

  4. POJ 2411 Mondriaan's Dream

    题意:用1*2的瓷砖拼出m*n的矩形.问有多少种拼法. 解法:设d[i][j]表示第i行状态为j的情况下,最多能有多少种拼法,对于状态j,1表示为竖着放置的瓷砖且它横跨i和i+1两行,其余皆用0表示. ...

  5. POJ 2411 Mondriaan's Dream(状态压缩DP)

    题目链接 早就见过这个题,开始以为有公式的,推了几次没推出,后来知道这个题是状态压缩DP.最近开始看状态压缩,本想试着解出来,但是这个比那个牛吃草复杂多了...位运算还是不是很熟练,这个题的解题报告有 ...

  6. POJ 2411.Mondriaan's Dream 解题报告

    题意: 给出n*m (1≤n.m≤11)的方格棋盘,用1*2的长方形骨牌不重叠地覆盖这个棋盘,求覆盖满的方案数. Solution:                位运算+状态压缩+dp       ...

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

    题目:poj 2411 Mondriaan's Dream 题意:给出一个n*m的矩阵,让你用1*2的矩阵铺满,然后问你最多由多少种不同的方案. 分析:这是一个比較经典的题目.网上各种牛B写法一大堆. ...

  8. Mondriaan‘s Dream(状态压缩dp)

    问题 S: Mondriaan's Dream 时间限制: 1 Sec  内存限制: 128 MB 提交: 2  解决: 2 [提交] [状态] [讨论版] [命题人:admin] 题目描述 Squa ...

  9. poj 3254 Corn Fields (状态压缩DP)

    题目:http://poj.org/problem?id=3254 思路见代码: #include<iostream> using namespace std;const int MOD= ...

最新文章

  1. oracle 查询重复数据并且删除, 只保留一条数据
  2. 百倍提升张量计算:谷歌开源TensorNetwork
  3. iOS UICollectionView 使用
  4. numpy.array创建行数超过一行的矩阵为什么要用两层中括号?
  5. 下拉框选中事件ajax,LayUI中select下拉框选中触发事件
  6. Java学习笔记2.3.2 运算符与表达式 - 赋值运算符
  7. 2020 年 Go 语言盘点:Go 的前进步伐不可阻挡
  8. p5.js之Q版人物绘制
  9. xcode10及iOS12问题
  10. 手机里的照片删了怎么恢复
  11. 用python画花球_只靠一把小小剪刀!她把这些花养成了花球!
  12. 容器-Docker《三》容器管理
  13. parted 4T磁盘
  14. 网络,接口和数据库测试要点
  15. 李立超python视频_《李》字意思读音、组词解释及笔画数 - 新华字典 - 911查询
  16. 再度公开少林内修心法(易筋经和洗髓经)欢迎转载,让全人类共享学习,过得更健康!
  17. Centos 基本命令
  18. 云通讯的下一个时代,需要的不只是AI
  19. 无限易pythongo开发期货量化策略
  20. Cris 的Python笔记(十一):面向对象三大特征之多态

热门文章

  1. pip经常的使用技巧
  2. Android studio 真机联调闪退
  3. 路由网关--spring cloud zuul
  4. 【安装】Mysql在Linux上安装
  5. C#用DesignSurface实现一个简单的窗体设计器
  6. Contiki 2.7 Makefile 文件(一)
  7. 【USACO】namenum
  8. unix编程艺术的设计原则
  9. 是谁卖了我的信息资料?
  10. java验证注册页面_Java使用正则表达式对注册页面进行验证功能实现