动态规划的本质是将当前问题拆解为若干个子问题,由子问题的结果得出当前问题的结果 核心是要构建出状态转移方程 例如:f(n) = f(n-1) + f(n-2) 其次要明确限制条件 例如:背包问题中的物品数量,背包容量等 动态规划的亮点在于可以复用子问题的解,避免了暴力穷举的多余运算
- 构建状态转移方程
通过题目得出影响到f(n)的因素 根据影响因素的多少,影响到了结果矩阵的维数 根据题目得出f(n)与f(x)之前的关系
- 构建结果矩阵dp
根据依赖的因素决定矩阵维数 可适当根据子问题的关系减少矩阵大小或者不使用矩阵 例如:f(n) = f(n-1) + f(n-2) 可以只保存最近的两个子结果
- 初始化赋值
有些子问题没有更小的子问题,其本身作为其他问题的基础,此时要根据实际情况赋初始值
- 循环计算子问题
从最小的子问题开始,逐一计算子问题,最终的子问题就是结果
- 特殊情况
有时候不能直接得到结果的dp方程 但是最终结果可以由若干中间结果得到 可以考虑寻找中间结果的dp方程 最后由中间结果计算出最终结果
当发现一个问题需要穷举所有的可能性时,要想到是否可以缓存复用其中部分可能性的值, 由此可以想到是否可以采用动态规划