状态压缩的动态规划
2016-08-05 18:52
176 查看
状态压缩的动态规划,简称状压DP,是一种将DP和枚举结合起来的方法,可以说是枚举的一种巧妙的优化。
简单来说,如果我们能够划分状态,但是很难继续细分(或者说是状态中的元素都彼此有关,但没有明显的规律),比如说可以将方阵按行划分,但是每行中的每个元素间都有一定的关系时,就可以枚举每一行的状态,再进行DP。也就是说,将状态的表示也作为DP状态表示的一(或几)维,然后相应的进行转移。这真是一个革命性的想法,不仅消除了纯枚举/搜索的效率问题,而且也没有那么难写(相比起一些较复杂的DP来说),应该说是相当不错的。
一般来说,状压DP的代码是这样的:
当然,有的时候枚举的状态中的合法状态相当少,特别是在限制很多、很严的时候,这时我们就为了效率,不会采取直接枚举状态的方法,而是产生状态,如果单个状态本身也有一些约束的话,那么也会相应的缩减状态数,于是这两大利器就成为了改善状压DP的两大方法。
当然,状压DP最难写的还是位运算,所以还是要掌握好一定的位运算基础才行了。
简单来说,如果我们能够划分状态,但是很难继续细分(或者说是状态中的元素都彼此有关,但没有明显的规律),比如说可以将方阵按行划分,但是每行中的每个元素间都有一定的关系时,就可以枚举每一行的状态,再进行DP。也就是说,将状态的表示也作为DP状态表示的一(或几)维,然后相应的进行转移。这真是一个革命性的想法,不仅消除了纯枚举/搜索的效率问题,而且也没有那么难写(相比起一些较复杂的DP来说),应该说是相当不错的。
一般来说,状压DP的代码是这样的:
//枚举DP转移方程的状态 //枚举要转移到什么状态 //转移并更新
当然,有的时候枚举的状态中的合法状态相当少,特别是在限制很多、很严的时候,这时我们就为了效率,不会采取直接枚举状态的方法,而是产生状态,如果单个状态本身也有一些约束的话,那么也会相应的缩减状态数,于是这两大利器就成为了改善状压DP的两大方法。
当然,状压DP最难写的还是位运算,所以还是要掌握好一定的位运算基础才行了。
相关文章推荐
- 动态规划之状态压缩
- uva 11795 Mega Man's Mission(动态规划-状态压缩DP)
- kuangbin求带飞DP1 Doing HomeWork(动态规划+状态压缩)
- 插头与轮廓线与基于连通性状态压缩的动态规划
- BZOJ 1087 浅谈状态压缩动态规划的转移
- 状态压缩动态规划 -- 棋盘问题 POJ 1321
- uva 11795 Mega Man's Mission(动态规划-状态压缩DP)
- 动态规划之状态压缩dp入门
- HDU 3091(动态规划-状态压缩)
- 基于连通性状态压缩的动态规划--【插头DP】模板超级详细解释
- 动态规划之状态压缩dp入门
- 动态规划专题:树上DP和状态压缩DP
- 动态规划(状态压缩):BZOJ 2621 [Usaco2012 Mar]Cows in a Skyscraper
- BZOJ 2064 浅谈状态压缩动态规划基础及lowbit枚举子集和
- 100道动态规划——27 POJ 1185 炮兵阵地 状态压缩,预处理,滚动数组
- Pieces(hdu4628,状态压缩的动态规划)
- POJ3254 Corn Fields 状态压缩动态规划,状压动规
- 状态压缩动态规划 -- 炮兵阵地
- 100道动态规划——31 POJ 2411 && POJ 2663 && POJ 3420 状态压缩 矩阵快速幂
- POJ 1185 炮兵阵地(动态规划+状态压缩)