AcWing 291.蒙德里安的梦想
题目:蒙德里安的梦想##
链接:(蒙德里安的梦想)[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.蒙德里安的梦想的更多相关文章
- 蒙德里安的梦想【状压DP】
求把N*M的棋盘分割成若干个1*2的的长方形,有多少种方案. 例如当N=2,M=4时,共有5种方案.当N=2,M=3时,共有3种方案. 如下图所示: 输入格式 输入包含多组测试用例. 每组测试用例占一 ...
- 状态压缩DP:蒙德里安的梦想
代码 #include<bits/stdc++.h> using namespace std; int n,m; long long f[12][1<<11]; bool yy ...
- 状压dp 持续更新
前置知识点:二进制状态压缩,动态规划. 1. AcWing 91 最短Hamilton路径 (https://www.acwing.com/problem/content/93/) 给定一张 n 个点 ...
- 梦想还需有,因它必实现——发现最新版iOS漏洞,OverSky团队专访
梦想还需有,因它必实现——发现最新版iOS漏洞,OverSky团队专访 “成功了!”,随着一句欢呼声在阿里巴巴西溪园区传出,Cydia的图标出现在一部iOS9.3.4的iPhone6上并成功运行 ...
- 屌丝程序员的梦想 (二) 屌丝IT梦开始地方
校区的周围有很多的网吧,一个对电子游戏迷恋了许久的青少年来说,那绝对是不可不去的地方,键盘,鼠标,显示器,那一切看起来都那么完美,那么似曾相识,是啊,魂牵梦绕的IT梦...哦..当时那只是电子游戏梦. ...
- 梦想还是要有的-纪念正式成为csdn博客专家暨年中总结
csdn博客:http://blog.csdn.net/tuzongxun 我的csdn历程(坚持总会有收获): 一年零三个月之前,2015年3月3日,我在csdn写下第一篇技术博客,只是记录了一 ...
- 再牛逼的梦想,也抵不住SB似的坚持
说起梦想,哪都是好几年前的事了.自从毕业之后,梦想不知道去哪了.可能一次次的失败,找不到了梦想的方向了吧! 自从毕业去了深圳,为了能够在这个城市安稳下来,白天正常上班晚上在街上摆地摊给人下载音乐和电影 ...
- 献给所有从事IT行业拥有梦想的英语渣们
本文适合读者:从小到大英语都不好,如今选择IT行业需要重拾英语追寻梦想的人,英语大神们请绕行.. 目录 一.背景介绍 二.明确学习目标 2.1 英文文法 2.2 词汇量 三.题外话 3.1 关于本文 ...
- 微软“One Windows”的梦想已经破灭了吗?
导读 Windows 10 正式公布的时候,微软曾表示该系统将开启更为个性化的计算新纪元,可让用户在使用各类设备处理各项事务时,享受到一致.熟悉和可兼容的体验,从 Xbox 到 PC 和手机,再到平板 ...
随机推荐
- T-SQL Part IV: ORDER BY
ORDER BY 返回一个Cursor,并不返回结果集.而试图将Cursor作为输入将产生了错误. 所以,下列的SQL语句将产生错误: SELECT VerID, IsComplete VerID, ...
- C++图像加Lidar点云转写rosbag
近期需要处理一批Lidar+image的数据,拿到的是其他格式,但要转存成rosbag使用,参考部分网上做法,完成并记录. 1.Lidar处理 主要是将Lidar点云信息按点转为pcl::PointX ...
- (C#)WPF:LinearGradientBrush的使用
在MSDN文档库里可以查到,Rectangle.Fill的类型是Brush.Brush是一个抽象类,凡是以Brush为基类的类都可作为Fill属性的值.Brush的派生类有很多: * SolidCol ...
- 关于css中的字体样式
1.决定字体的属性 color:字体颜色 属性值:单词,十六进制表示,rgb 2.字体大小 font-size:12px:属性值是整数字,不要带小数,单位是px叫做像素单位:凡是由像素拼成的图片我们 ...
- [ch01-03]神经网络基本原理
系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力. 前言 For things I don't know h ...
- nyoj 311-完全背包 (动态规划, 完全背包)
311-完全背包 内存限制:64MB 时间限制:4000ms Special Judge: No accepted:5 submit:7 题目描述: 直接说题意,完全背包定义有N种物品和一个容量为V的 ...
- nyoj 63-小猴子下落 (模拟)
63-小猴子下落 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:2 submit:5 题目描述: 有一颗二叉树,最大深度为D,且所有叶子的深度都相同 ...
- Lab8:文件系统
文件系统的概念 文件系统是操作系统中管理持久性数据的子系统,提供数据存储和访问功能 文件是具有符号名,由字节序列构成的数据项集合 文件系统的功能 分配文件磁盘空间 管理文件块(位置和顺序) 管理空闲空 ...
- python:爬虫1——实战(下载一张图片、用Python模拟浏览器,通过在线的有道词典来对文本翻译)
一.下载一只猫 import urllib.request response = urllib.request.urlopen("http://cdn.duitang.com/uploads ...
- windows 10安装和配置caffe教程 | Install and Configure Caffe on windows 10
本文首发于个人博客https://kezunlin.me/post/1739694c/,欢迎阅读! Install and Configure Caffe on windows 10 Part 1: ...