直面动态规划之理论篇

181 阅读2分钟

这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

老实说,我是个动态规划重度恐惧患者,笔试题一看,可能是个动规,十有八九会quit😧。希望通过写这一个系列的文章,直面动规,不要再落荒而逃了。

首先,什么样的问题可以用动态规划来解决呢?我们可以看看它是否符合“一模型三特征”。

一模型指的是多阶段决策最优解模型,三特征指的是

  • 最优子结构:可以通过子问题的最优结果推出更大规模问题的最优结果
  • 无后效性:存在重复状态,而这个重复状态和到达此状态的路径无关
  • 重复子问题:到达同一状态有多种走法

其次,我们可以分下面几步走:

  1. 找到状态和选择。 状态指的是算法在推进过程中会变化的变量; 选择指对于每种状态可以做出的选择。

  2. 明确dp数组的定义,找出base case。 注意这个我们定义的dp数组要能做到将dp[i+1]和dp[i]建立起联系,不然需要重新定义。有时候可以有不同的定义,也会导致不同的解法。

  3. 寻找状态之间的关系(即状态转移方程) 根据dp数组的定义,假设dp[0]到dp[i-1]已知,运用数学归纳法求出dp[i]。

最后,我们再来侃一下四大天王贪心、回溯、动态规划以及分治到底有什么区别叭。 前三者都满足是”多阶段决策最优解模型“,而贪心具有的是最优子结构、无后效性以及贪心选择性,所谓的贪心选择性指的是可以通过局部最优产生全局最优;回溯的话就是最简单粗暴的穷举搜索;动态规划我们上面已经说过它的三个特征了;最后的分治的特点是它不能有重复子问题。如果讲完动态规划还有机会的话,我们再来说说其他三种算法~

理论篇大概就讲这些啦,谢谢你看到这里,这些主要是对于动态规划学习的一些总结,接下来是实训篇,让我们在做题中巩固动态规划的解题套路叭!!

本文参考:极客专栏《数据结构与算法之美》、《labuladong》的算法小抄