动态规划
实现方法
动态规划是付出额外的内存空间来节省计算时间,通常有两种实现方法:
1 带记忆的自顶向下法
按照自然递归方式编写过程,过程中保存每个子问题的解(散列表或者数组)。当需要子问题的解时,首先检查是否已经保存过此解。若是,则返回保存的值;否则重新计算。“记住”了之前已经计算过的结果。
2 自底向上
将子问题按照规模排序,按照由小到大的顺序求解。当求解某个子问题时,它所依赖的更小的子问题都已经解决,结果已经保存。每个子问题只需求解一次,其更小的子问题也已经解决。
适用问题
用动态规划的问题应该具备两个要素:
1 最优子结构
如果一个问题的最优解包含其子问题的最优解,则此问题就具备最优子结构。保持子问题尽可能简单,只有在必要时才扩展。即问题可以向下分解,它的子问题的最优解可以拼凑出它的最优解。要注意子问题应该是相互无关的比较好。
2 重叠子问题
子问题的空间要足够“小”,即问题的递归算法会反复求解相同的子问题,而不是一直生成新的子问题(即如果问题蛮力求解时会重复计算已经算过的,就存在重叠子问题,可以把这些解保存起来避免重复计算)。
解题步骤
-
状态定义
-
转移方程
-
-
返回值


浙公网安备 33010602011771号