前言 最近在学习AcWing的状态压缩dp部分,感觉这部分算是动态规划里面比较难的部分了,光蒙德里安这题就花了我将近2h来理解学习,所以花点时间来记录一下(而且这题好像听说是很多Acmer的第一道状压题~),其中代码部分加上了必要注释方便理解~ 题目 思路 具体的思路可以看看这个大佬写的题解shizhengLee~,很感谢大佬的...
蒙德里安没有梦想!!! 对于此题,很想蓝书上面的费解的开关,都是通过前一个状态来推导出后一个状态 首先要确定状态表示: f[i][j]中表示第i列每一行小长方形横着摆放的方案数,其中以小长方形右边的宽作为边界,属性是求方案数 其次就是状态计算: 在摆放横着的长方形的过程中,当该方案所有横着的长方形已经固...
一、核心思想 1、先放横着的,再放竖着的。 2、总方案数等于只放横着的小方块的合法方案数。 为什么呢?因为如果把横着的全部放完之后,其它的空用竖着的来放就行啦。如果横的放完了,竖着的方案数是唯一的。 那如何判断方案是否合法? 当前摆完横着的小方块之后,所有剩余的位置,如果能填充满竖着的小方块就是合法,...
于是有了第一个条件 我们还要考虑当这一行可以由上一行的哪些状态转移过来 举个例子:第 i 行是 1001001 那第i-1 行必须是 1XX1XX1, X代表0||1 换句话 i-1 行是 1 的位置 第 i 行必须是;i-1 行是 0 ,i 行无影响任意填 但是还有个问题,如果把这两个条件分开考虑会有问题 如 00100 00100 __...
蒙德里安的梦想——状态压缩dp 291. 蒙德里安的梦想 - AcWing题库 这道题想写出来真恶心啊(起码对于现在的我来说)主要用的方法就是正确选择dp的状态表达,以及使用状态压缩把每一种状态用二进制的01式子表示出来。 目前碰到的状态压缩就是把一种状态抽象成0与1,以01式子的形式表示该状态。
AcWing 291. 蒙德里安的梦想 原题链接中等 作者: secondddddd , 2024-07-20 19:55:17 , 所有人可见 , 阅读 1 0 #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N = 12, M = 1 << N; // N是12,M是2^N int n, m; // 矩形行数和列数 ...
这题是状态压缩DP的经典例题。 题目的关键几点条件想通以后题目得到简化: (1)所有的摆放方式可以被分为横竖两种,而横竖两种摆放方式,其实只需要确定其中一种的放法,另外一种的摆放放法就固定了。(我们这里以横摆法为例) (2)所有合法的横摆法实际上需要符合所有”列“的连续空格数为偶数(这样就能刚好将竖着的方块...
// 蒙德里安的梦想:https://ac.nowcoder.com/acm/contest/1046/A #include <iostream> #include <cstring> // memset using namespace std; const int M = 12, N = 1 << M; long long dp[M][N]; bool state[N]; // state[i]==true表示i中连续0的个数都为偶数 ...
求个算法..想找一位大佬用C++帮忙写个算法,要求如下:在一个矩形区域(Xmax*Ymax)内摆放若干个小矩形(lmin*wmin大小尺寸均相同),不能重叠,每次都是放到不能放为止,放置方法只有横向和竖向,不存在
Acwing - 蒙德里安的梦想 原题:291. 蒙德里安的梦想 - AcWing题库 题意:求把N×M的棋盘分割成若干个1×2的的长方形,有多少种方案。 分析:状压dp,具体看代码注解。 题解: //状压dp:棋盘式//二进制记录状态//结论:总方案数=只考虑横着放的方案数(考虑完横着放后,把竖的填进去就完事了)//根据上述...