状态压缩的动态规划

状态压缩的动态规划,简称状压DP,是一种将DP和枚举结合起来的方法,可以说是枚举的一种巧妙的优化。
简单来说,如果我们能够划分状态,但是很难继续细分(或者说是状态中的元素都彼此有关,但没有明显的规律),比如说可以将方阵按行划分,但是每行中的每个元素间都有一定的关系时,就可以枚举每一行的状态,再进行DP。也就是说,将状态的表示也作为DP状态表示的一(或几)维,然后相应的进行转移。这真是一个革命性的想法,不仅消除了纯枚举/搜索的效率问题,而且也没有那么难写(相比起一些较复杂的DP来说),应该说是相当不错的。
一般来说,状压DP的代码是这样的:

//枚举DP转移方程的状态
    //枚举要转移到什么状态
        //转移并更新

当然,有的时候枚举的状态中的合法状态相当少,特别是在限制很多、很严的时候,这时我们就为了效率,不会采取直接枚举状态的方法,而是产生状态,如果单个状态本身也有一些约束的话,那么也会相应的缩减状态数,于是这两大利器就成为了改善状压DP的两大方法。
当然,状压DP最难写的还是位运算,所以还是要掌握好一定的位运算基础才行了。

你可能感兴趣的:(算法,总结)