Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series' (where he had to use his toilet paper to draw on, for all of his paper was filled with squares and r…
动态规划当中有非常常见的一个分支--状态压缩动态规划,很多人对于状态压缩畏惧如虎,但其实并没有那么难,希望这文章能带你们学到这个经典的应用. 二进制表示状态 在讲解多重背包问题的时候,我们曾经讲过二进制表示法来解决多重背包.利用二进制的性质,将多个物品拆分成少数个物品,转化成了简单的零一背包来解决.今天的状态压缩同样离不开二进制,不过我个人感觉今天的二进制应用更加容易理解一些. 二进制的很多应用离不开集合这个概念,我们都知道在计算机当中,所有数据都是以二进制的形式存储的.一般一个 \(int\)…
https://vjudge.net/problem/UVA-11270 题意: 用1×2骨牌覆盖n×m棋牌,有多少种方法? 思路: 这道题目是典型的轮廓线DP题. 所谓轮廓线DP,就是以整行整列为状态进行动态规划时无法进行状态转移,那么此时就可以用到轮廓线,当然,这种方法只能使用在一个窄棋盘上,大了肯定是不行的,要超时! ' 轮廓线DP就是按照从上到下,从左到右的顺序进行状态转移,每个格子用二进制来表示状态,1代表的就是覆盖,0代表未覆盖. 以本题为例,如上图,我们现在要计算 k 格子,那么与…
题解: 插头dp裸题 没什么好说的啊就是n个二进制位表示状态 相比原先就是用2n个二进制位表示状态 蓝书上后面几题插头dp都挺烦的啊... 代码:…
引入 首先来说说“状态压缩动态规划”这个名称,顾名思义,状态压缩动态规划这个算法包括两个特点,第一是“状态压缩”,第二是“动态规划”. 状态压缩: 从状态压缩的特点来看,这个算法适用的题目符合以下的条件: 1.解法需要保存一定的状态数据(表示一种状态的一个数据值),每个状态数据通常情况下是可以通过2进制来表示的.这就要求状态数据的每个单元只有两种状态,比如说棋盘上的格子,放棋子或者不放,或者是硬币的正反两面.这样用0或者1来表示状态数据的每个单元,而整个状态数据就是一个一串0和1组成的二进制数.…
背景 北京奥运会开幕了,这是中国人的骄傲和自豪,中国健儿在运动场上已经创造了一个又一个辉煌,super pig也不例外……………… 描述 虽然兴奋剂是奥运会及其他重要比赛的禁药,是禁止服用的.但是运动员为了提高成绩难免要服用一些,super pig也不例外.为了不被尿检检查出来,这些药品就只能选一些不容易被发现的来服用.但是奥委会关于兴奋剂检查有很多个指标,只有尿检中各项数值均不高于规定指标才算成阴性(“你没服兴奋剂”),所以如何服用适量的药品使自己的水平达到最高是每个运动员困扰的问题. 现在有…
总述 状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式 很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用,例题里会给出介绍 有了状态,DP就比较容易了 举个例子:有一个大小为n*n的农田,我们可以在任意处种田,现在来描述一下某一行的某种状态: 设n = 9: 有二进制数 100011011(九位),每一位表示该农田是否被占用,1表示用了,0表示没用,这样一种状态就被我们表示出来了:见下表 列 数 1 2 3 4 5 6 7 8 二进制 1…
轮廓线动态规划是一种基于状态压缩解决和连通性相关的问题的动态规划方法 这道题是轮廓线动态规划的模板 讲解可以看lrj的蓝书 代码 #include <cstdio> #include <algorithm> #include <cstring> using namespace std; long long has[120][120],n,m,dp[2][1<<15],cur;// void update(int a,int b){ if(b&(1&l…
[arc093f]Dark Horse(容斥原理,动态规划,状态压缩) 题面 atcoder 有 \(2^n\) 名选手,编号为 \(1\) 至 \(2^n\) .现在这 \(2^n\) 名选手将进行 \(n\) 轮淘汰赛,决出胜者.若 \(x<y\) ,则 \(x\) 能够战胜 \(y\) .但有 \(m\) 个例外,\(1\) 号选手会输给这 \(m\) 个选手.问有多少中排列方式使得\(1\)号选手取得胜利.\(n,m≤16\). (这是肖大佬的翻译) 题解 钦定\(1\)号站在一号位置(…
题意 https://www.lydsy.com/JudgeOnline/problem.php?id=1435 思路 一道很好的状压/容斥题,涵盖了很多比较重要的知识点. 我们称每两行间均有纵跨.每两列之间均有横跨为附加要求,我们先考虑没有附加要求的情况.直接存一行状态进行 \(dp\) 的话,似乎要枚举子集,复杂度挺大的. 这种类型的状压有一种比较神仙的优化方法--轮廓线. 如上图所示,假如决策到的点是橙色的点,那么红线指的就是轮廓线,这种状压的方法可以会让状态数乘一个 \(n\) ,但是这…