状压DP仓促

状压DP学习笔记

【Part1 前言&闲谈】

作为一个<全机房 && 全浙江 && 全中国>最菜的蒟蒻,自己对状压这个算法真的不怎么熟悉,所以决定花清明的时间好好补一补状压和状压DP这个(想必您们各位大佬都会,一看题目就轻松秒掉的)算法。
对于状压,就是通过二进制位运算使一些状态被压缩成一个数,从而化简算法的时间复杂度(毕竟不是人人都可以像xk一样N2过百万的,%%%xk)的优化算法啦,乍一听概念还是挺简单的(然而我肯定是菜到仍然学不会的)。

【Part2 前置知识】

先来了解一些基本的位运算:&(与),|(或),~(取反),^(异或),<<(左移),>>(右移)。
对于位(二进制数)的基本运算:
&(与) : < x & y > 同1则1,否则0.
|(或) : < x | y > 同0则0,否则1.
~(取反) :< ~x > 原为1则0,否则1.
^(异或) :< x ^ y > 不同则0,否则1.
对于数(十进制数)的基本运算:
&、|、~、^ : 将十进制数化成二进制数,再对于每位分别进行相应的位运算。
<<(左移) : < x << y > 将十进制数化为二进制数后向左移动y位,左边多余的位舍去,右边新增的位用0补足,相当于 x * 2y(证明显然).

(右移) : < x >> y > 将十进制数化为二进制数后向右移动y位,左边新增的位用0补足,右边多余的位舍去,相当于 ⌊ x \ 2y ⌋(证明同上).
强调:位运算的优先级很迷,建议多加括号区分
【Part3 状态压缩】

从现在开始正文。

再来是一些状态压缩的初步运算,如果第一次学不建议死记硬背,在理解的基础上先记住重要的和好记的(如又重要又好记的lowbit)然后通过多切题来不断巩固就可以熟练地使用状态压缩了(明明各位巨佬肯定都会,我为什么要瞎逼逼QAQ)

通过以上的操作就可以愉快的状压了

【Part4 DP优化】

来一道入门题

思路:
	从n <= 10,很显然可以看出这是一道状压题(因为状压大多都是指数级别,n大多小于30)假设定义对于每个灯0为开、1为关,那么我们可以使(0)10=(000000000)2来表示10个灯都为开的状态、(210-1)10=(1111111111)210个灯都为关的状态,同理每一个小于等于2n-1的十进制数都可以表示成n个灯的状态,DP方程很显然,对于每个状态(n位二进制数化成的十进制数)可以通过某一个开关所到达的新的状态,只要

F[改变之后的状态]=min(F[当前方案]+1,F[改变之后的状态]);
注意:初始化对于每个状态的F数组都要赋一个很大的数,F[0]=0(笔者那么弱的人就搞基地死在了这里三次)
附上程序:

扫描二维码关注公众号,回复: 6215080 查看本文章

评测结果:

评测记录(那么水的题我还错3次我真的是没救了):

再来一道大水题(你们看一眼就可以秒掉的题目&我当然不会做了)
这是一样NOIP2017D2T2的原题

思路:这道题的标算貌似是模拟退火(经hsy指出,退火不可能为任意问题标算,所以这是我乱说的),然而用状压DP也是可以跑过的(貌似还有种最小生成树的感觉)(然而题解都是状压+dfs什么鬼啊!)
	以下思路由luogu<GoldPotato137>的题解启发得到
	N同样<=12(所以你们一眼就看出来这是状压)
	根据我们以往的思路对于状压的操作,我们发现对于相同的状态,不同的连接方法得到的解不一定相同(因为k不一定相同),但是我们发现k在以某一个点为根的最小生成树中,k就是点的深度,所以我们可以以深度来状压DP。

	所以,我们可以设f[i][j]表示到第i层,总共取点状态为j(j为二进制状态表示的十进制数),那么不难得出DP转移方程:

F[i][j] = min(F[i][j], F[i – 1][k] + trans[k][j] * (i – 1))
(k为j的子集)(trans[i][j]表示有状态i转移到状态j的最小价值)
其中,trans数组需要事先预处理,其中需要一个小技巧:
对于状态i,如何确定i的所有子集
如果傻逼枚举,复杂度为O(2n),就会傻逼T到飞起,所以我们:
for (int j = i; i != 0; i = (j – 1) & i)
对于i的是1的位选择几个变成0,大家可以自己证明一下。
所以可以得出j就是i的全部子集
所以只需初始化f[1][2^(i-1)]=0(i∈[1,n])
答案就是min(f[i][2^n-1]) (i∈[1,n])
贴AC程序
评测结果:

【Part5 结语&感谢名单】
就这样,我们愉快地学会了状压DP啦。
特别感谢:
%%%hsy杭二小神仙T2提供了一种全排列的笔者看不懂的神仙思路和本题解的大致格式参考并且修改了本稿的一些错误。
%%%cy慈中乱搞之神T2给了笔者非常大的帮助,提供了多种思路的理解
以上两位神仙百忙之中帮助我,深表感谢。
赶稿仓促,不足之处望神仙发现之后海涵

猜你喜欢

转载自blog.csdn.net/qq_15647239/article/details/89088346