2018过农历新年这几天,学了一下状态压缩动态规划,如今先总结一下。html
状态压缩实际上是一种并无改变dp本质的优化方法,阶段仍是要照分,状态仍是老样子,决策依旧要作,转移方程仍是得列,最优仍是最优,无后仍是无后,因此它比较好理解。数组
状压,顾名思义就是要将一些状压想办法压缩起来(能够压,也能够删)。其中这些状态都知足类似性和数量不少。这样才好压并且压得有意义。常见于通常的方格题,网络题等等。网络
因此通常基础的状压就是将一行的状态压成一个数,这个数的二进制形式反映了这一行的状况。因此位运算能够帮助咱们解决不少问题。我看了一篇讲义,感受挺好的,就直接拿来用了,这里会介绍二进制的基本操做和一些常见用法。函数
这些操做都是在一个数转成二进制的状况下作的,包括按位与&、或|、取反~(注意负数补码的符号)、异或^(不一样则真)、左移<<、右移>>。优化
下面是由江苏省淮阴中学薛志坚整理的一些常见操做:spa
接下来就是进行普通dp的操做。htm
不过这里要注意几点blog
初试化状态的时候要看清条件,什么要,什么不要。get
通常状况下要预处理前k行(k由题目定)。it
Dp时题目给的条件和fit函数、state数组都要检查。
最最重要的一点:位反(~ ) > 算术 > 位左移、位右移 > 关系运算
> 位与 > 位或 > 位异或 > 逻辑运算
因此通常位运算最好打括号。
讲讲不常规的状压dp。
咱们要找一个方法将多余的状态给砍掉或者缩成一段。
上例题:
一、Corn Fields
最基础的状压dp,不少时候能够用来做为模板借鉴着作其余题目。
详情请看:这里
二、互不侵犯King
好像是优化搜索,其实仍是dp,不过这里比t1的条件多了、难了,也比t1多限定了一个国王数量,因此要多存一个国王数量的状态,可是其实仍是很基础。
详情请看:这里
三、炮兵阵地
这里从一个单行状态变成了双行状态,其余都很模板。
详情请看:这里
四、过河
这是第一道升级的状压,它终于不是普通01串的状态,而是将没用的状态给直接砍掉,再进行dp
详情请看:这里
五、强迫症的炸山
这是我同窗(一位大佬)lxy出的题,这道看似很简短、很简单的题,作起来却不是那么容易。我甚至还没找到怎么正确地压缩状态。至今未果,之后会慢慢补充。毕竟如今打暴力得了tle,打正解(手动划去)得了re,我也很无奈。
状压dp其实不止这么简单,我此次学了只是皮毛中的皮毛,状压要捉住怎么压缩状态,加快程序运行,别的就和普通dp同样了。
请各位大佬指出错误或补充,谢谢。
嗯,就这样了。