题目:蒙德里安的梦想##

链接:(蒙德里安的梦想)[https://www.acwing.com/problem/content/293/]

题意:求把N * M的棋盘分割成若干个1 * 2的长方形,有多少种方案。

例如当N = 2,M = 4时,共有5种方案,当N = 2,M = 3时,共有3种方案

分析:

1.当把所有横着的长方形放置好后,那么竖着的长方形的放置方法是唯一的

2.f[i, j]表示放置第i列时,第i列的状态是j的所有方案,j表示从第i - 1列伸出方块到第i列的状态

3.竖着的空着方块是用来放置1 * 2的长方形的,因此需要连续偶数个空方块,我们可以预处理出来是否能放置

4.如何正确地转移?首先不能产生冲突,f[i - 1, k]表示放置第i - 1列时,k是从i - 2列伸出来到i - 1列的方块

所以为了避免产生冲突,要放置长度为2的长方形,k & j必须为0,某一列的某一行只能放置一个方块

5.j | k,假设j的某一行有一个方块,那么k这里会从0填充到1,然后k剩余的方格里有没有连续的偶数个方块

#include <cstring>
#include <cstring>
#include <iostream> using namespace std; const int n = 12;
const int m = 1 << 12;//第二维状态最大有2^12种可能 typedef long long ll;
bool st[m];//state,预处理好的状态
ll f[n][m]; int main()
{
int n, m;
while (scanf("%d%d", &n, &m), n || m) {
//预先处理好状态,在DP过程中直接判断 for (int i = 0; i < 1 << n; ++i) {
st[i] = true;//先设置好每个状态为1
int cnt = 0;//统计连续0的个数
for (int j = 0; j < n; ++j) {//判断每一位是否为0
if (i >> j & 1) {//判断之前已经累计好的0个数为奇数
if (cnt & 1)
st[i] = false;//为奇数,设置为false
cnt = 0;//重新累计0的个数
}
else {
++cnt;//没碰到1,就累计0的个数
}
}
if (cnt & 1)
st[i] = false;//如果最后的是连续的0,没有碰到1,就需要再判断一下
} memset(f, 0, sizeof f);
f[0][0] = 1;
for (int i = 1; i <= m; ++i) {//m + 1列,多计算m + 1列
for (int j = 0; j < 1 << n; ++j) {//i列的第二维状态
for (int k = 0; k < 1 << n; ++k) {//i - 1列的第二维状态
if ((j & k) == 0 && st[j | k]) {
f[i][j] += f[i - 1][k];
}
}
}
} printf("%lld\n", f[m][0]); } return 0;
}

AcWing 291.蒙德里安的梦想的更多相关文章

  1. 蒙德里安的梦想【状压DP】

    求把N*M的棋盘分割成若干个1*2的的长方形,有多少种方案. 例如当N=2,M=4时,共有5种方案.当N=2,M=3时,共有3种方案. 如下图所示: 输入格式 输入包含多组测试用例. 每组测试用例占一 ...

  2. 状态压缩DP:蒙德里安的梦想

    代码 #include<bits/stdc++.h> using namespace std; int n,m; long long f[12][1<<11]; bool yy ...

  3. 状压dp 持续更新

    前置知识点:二进制状态压缩,动态规划. 1. AcWing 91 最短Hamilton路径 (https://www.acwing.com/problem/content/93/) 给定一张 n 个点 ...

  4. 梦想还需有,因它必实现——发现最新版iOS漏洞,OverSky团队专访

    梦想还需有,因它必实现——发现最新版iOS漏洞,OverSky团队专访    “成功了!”,随着一句欢呼声在阿里巴巴西溪园区传出,Cydia的图标出现在一部iOS9.3.4的iPhone6上并成功运行 ...

  5. 屌丝程序员的梦想 (二) 屌丝IT梦开始地方

    校区的周围有很多的网吧,一个对电子游戏迷恋了许久的青少年来说,那绝对是不可不去的地方,键盘,鼠标,显示器,那一切看起来都那么完美,那么似曾相识,是啊,魂牵梦绕的IT梦...哦..当时那只是电子游戏梦. ...

  6. 梦想还是要有的-纪念正式成为csdn博客专家暨年中总结

    csdn博客:http://blog.csdn.net/tuzongxun 我的csdn历程(坚持总会有收获):   一年零三个月之前,2015年3月3日,我在csdn写下第一篇技术博客,只是记录了一 ...

  7. 再牛逼的梦想,也抵不住SB似的坚持

    说起梦想,哪都是好几年前的事了.自从毕业之后,梦想不知道去哪了.可能一次次的失败,找不到了梦想的方向了吧! 自从毕业去了深圳,为了能够在这个城市安稳下来,白天正常上班晚上在街上摆地摊给人下载音乐和电影 ...

  8. 献给所有从事IT行业拥有梦想的英语渣们

    本文适合读者:从小到大英语都不好,如今选择IT行业需要重拾英语追寻梦想的人,英语大神们请绕行.. 目录 一.背景介绍 二.明确学习目标 2.1 英文文法 2.2 词汇量 三.题外话 3.1 关于本文 ...

  9. 微软“One Windows”的梦想已经破灭了吗?

    导读 Windows 10 正式公布的时候,微软曾表示该系统将开启更为个性化的计算新纪元,可让用户在使用各类设备处理各项事务时,享受到一致.熟悉和可兼容的体验,从 Xbox 到 PC 和手机,再到平板 ...

随机推荐

  1. java架构之路(MQ专题)kafka集群配置和简单使用

    前面我们说了RabbitMQ和RocketMQ的安装和简单的使用,这次我们说一下Kafka的安装配置,后面我会用几个真实案例来说一下MQ的真实使用场景.天冷了,不愿意伸手,最近没怎么写博客了,还请见谅 ...

  2. [LC]203题 Remove Linked List Elements (移除链表元素)(链表)

    ①英文题目 Remove all elements from a linked list of integers that have value val. Example: Input: 1-> ...

  3. 领扣(LeetCode)转置矩阵 个人题解

    给定一个矩阵 A, 返回 A 的转置矩阵. 矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引. 示例 1: 输入:[[1,2,3],[4,5,6],[7,8,9]] 输出:[[1,4,7] ...

  4. python:类1——类和对象基础

    一.OO = Object Oriented 面向对象 OOP面向对象编程.OOA面向对象分析.OOD面向对象设计 二.属性+方法——>类(数据和函数) class Turtle(): #类名约 ...

  5. InfluxDB 聚合函数实用案例

    InfluxDB 聚合函数实用案例 文章大纲 InfluxDB 简介 InfluxDB是GO语言编写的分布式时间序列化数据库,非常适合对数据(跟随时间变化而变化的数据)的跟踪.监控和分析.在我们的项目 ...

  6. Composer依赖管理 – PHP的利器

    别再到处搜PHP类扩展包了,对于现代语言而言,包管理器基本上是标配.Java 有 Maven,Python 有 pip,Ruby 有 gem,Nodejs 有 npm.PHP 的则是 PEAR,不过 ...

  7. keypress 和 blur 事件冲突的问题

    需求:点击需求:点击添加标签,出来input框,内容输入完成后点击enter键和blur时都可以执行提交标签的效果,提交时对内容进行判断,执行完成后清除input内的内容.如下图 问题:内容输入完成后 ...

  8. pyhton3 之 time模块实例小结

    一.实例1:实现秒表: import time print('按下回车开始计时,按下 Ctrl + C 停止计时.') while True: try: input() # 如果是 python 2. ...

  9. 03_Matplotlib的基本使用

    python利用Matplotlib.pyplot库绘制不同的图形,但是在显示中文时存在部分问题,一般在导入库后,添加如下代码: # 设置中文正常显示 plt.rcParams['font.sans- ...

  10. 通过 Python 理解 Mixin 概念

    Mixin 的概念 Mixin 即 Mix-in,常被译为"混入",是一种编程模式,在 Python 等面向对象语言中,通常它是实现了某种功能单元的类,用于被其他子类继承,将功能组 ...