状态压缩动态规划

    技术2025-03-18  26

    状态压缩动态规划

    什么是状态压缩动态规划

    \qquad 状态压缩动态规划又称之为状压DP,这是针对NP难问题的一种特殊的动态规划技巧,状态压缩动态规划顾名思义,就是状态压缩+动态规划,首先讲一下动态规划适用情形。 \qquad 动态规划适用的调价是有子问题,且子问题有重叠,动态规划问题理论上都可以用递归算法来解决,但是递归算法往往要用到很多递归栈,且对子问题无法进行区分,所以对于子问题重叠问题,递归算法效率不足,因此子问题重叠的问题,通常采用动态规划的算法。 \qquad 本质上动态规划也是穷举搜索,而非局部搜索,(注:这两者是否可以结合理论上应当是可以的,但是我对此并无了解,可能是动态规划本身效率已经足够,非研究者很少关注进一步剪枝降低复杂度),区别于暴力的DFS等递归算法,适合用动态规划的问题,其问题中的子问题具有很大的重叠性,所有在搜索的过程过程中可以将更小的子问题的计算结果保留下来,然后在后续搜索到时直接利用之前计算的结果来推导出更高一层的结果,这样就会节省很大的计算开销,从而降低复杂度。 \qquad 由此可见,什么问题适合动态规划其实很明显,只要判断问题中子问题是否存在,子问题之间是否有重叠即可,至于如何判断子问题,以及如何判断子问题重叠我想应该从问题本身就可以判断。当然如果问题不存在子问题,问题本身就是一个整体动态规划就没有办法使用了,但是动态规划适用的范围还是挺广泛的。 \qquad 状态压缩动态规划主要包括两个方面——状态压缩+动态规划,那么什么是状态压缩呢? \qquad 状态压缩通常运用到棋盘搜索等NP难的问题中,这种问题中直接利用DFS或者BFS进行搜索时资源占用率很高,因为每一步搜索都要记录全局的的棋盘信息,即使DFS只考虑当前搜索的一枝,但是随着搜索深度的加深,存在递归栈里面的棋盘信息也会急剧增多,并且由于搜索是指数级增长的,所以算法复杂度很高,而状态压缩则是想到利用计算机的二进制表示方法,来表示棋盘可能的状态,这样即使不使用动态规划而仅仅使用搜索算法,其空间占用率也会大大降低,所以状态压缩的作用主要在于降低算法的空间复杂度。 \qquad 那么状态压缩后怎么利用动态规划呢?其实与传统的动态规划并不显著区别,原来的数据结构用状态压缩后的数据表示了,现在只需要考虑如何在新的表示方法中来使用动态规划即可,动态规划的目的除了降低时间复杂度,还会降低空间复杂度。下面用实例来体会这种精髓!

    状压DP的例子

    \qquad ①有一个N*M(N<=5,M<=1000)的棋盘,现在有1*2及2*1的小木块无数个,要盖满整个棋盘,有多少种方式?答案只需要mod1,000,000,007即可。 \qquad 看这篇吧: 状压DP的例子

    Processed: 0.009, SQL: 9