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

链接:(蒙德里安的梦想)[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. 关于Jvm的见解(二)

    栈管运行,堆管存储!!! 栈呢,也叫作栈内存,主要管java程序的运行,在线程创建时创建,生命周期和线程一致,只要线程一结束,该栈就被GC,是线程私有的.基本类型的变量和对象的引用数据类型的变量都在栈 ...

  2. redis集群节点重启后恢复

    服务器重启后,集群报错: [root@SHH-HQ-NHS11S nhsuser]# redis-cli -c -h ip -p 7000ip:7000> set cc dd(error) CL ...

  3. Java枚举——枚举的作用、使用方法、使用场景

    枚举的定义 枚举关键字enum 枚举类是一种特殊类,它和普通类一样可以使用构造器.定义成员变量和方法,也可以实现多个接口,但不能继承类. 枚举的使用 enum Color { RED, BLUE, G ...

  4. 在VMware15.5中安装CentOS7_7_64bit

    一.创建虚拟机 在我的另一个随笔里有. 地址为:https://www.cnblogs.com/qi-yuan/p/11692092.html 只是在虚拟机安装操作系统时候选择 Linux 而不是 W ...

  5. gcc在x64体系中如何传递参数,linux,mac,iOS适用

    上一篇介绍了vc(windows)平台在x64体系当中,c函数的传参方式.本篇将要介绍gcc(类linux,mac)平台在x64中,c函数是如何传参的.为节约时间和篇幅,首先来定义一个有十个参数的函数 ...

  6. scrapy介绍及使用

    scrapy的流程 其流程可以描述如下: 调度器把requests-->引擎-->下载中间件--->下载器 下载器发送请求,获取响应---->下载中间件---->引擎-- ...

  7. [ubuntu篇] 使用Hexo建立个人博客,自定义域名https加密,搜索引擎google,baidu,360收录

    为了更好的阅读体验,欢迎阅读原文.原文链接在此. Part 1: Using Github Pages and Hexo to manage personal blogs. Series Part 1 ...

  8. 解决django或者其他线程中调用scrapy报ReactorNotRestartable的错误

    官网中关于ReactorNotRestartable的错误描述(摘自:https://twistedmatrix.com/documents/16.1.0/api/twisted.internet.e ...

  9. linux关闭不必要的用户

    #!/bin/bash for user in $( cat /etc/passwd | grep -v root | cut -d ":" -f 1 ) do str=(adm ...

  10. Makefile使用指南

    转载请标明出处:http://blog.csdn.net/shensky711/article/details/52231202 本文出自: [HansChen的博客] 什么是Makefile Mak ...