算法 系列 动态规划

基础数据结构...

Posted by lichao modified on September 20, 2019

如何判断一个问题能否使用DP解决呢?能将大问题拆成几个小问题,且满足无后效性、最优子结构性质。

动态规划问题的⼀般形式就是求最值。动态规划其实是运筹学的⼀种最优化⽅法,只不过在计算机问题上应⽤⽐较多,⽐如说求最⻓递增⼦序列呀,最⼩编辑距离等等。既然是要求最值,核⼼问题是什么呢?求解动态规划的核⼼问题是穷举。因为要求最值,肯定要把所有可⾏的答案穷举出来,然后在其中找最值:

  1. ⾸先,动态规划的穷举有点特别,因为这类问题存在「重叠⼦问题」,如果暴⼒穷举的话效率会极其低下,所以需要「备忘录」或者「DP table」来优化穷举过程,避免不必要的计算。
  2. ⽽且,动态规划问题⼀定会具备「最优⼦结构」,才能通过⼦问题的最值得到原问题的最值。
  3. 另外,虽然动态规划的核⼼思想就是穷举求最值,但是问题可以千变万化,穷举所有可⾏解其实并不是⼀件容易的事,只有列出正确的「状态转移⽅程」才能正确地穷举。

动态规划的⼀般流程就是三步:暴⼒的递归解法 -> 带备忘录的递归解法 -> 迭代的动态规划解法。就思考流程来说,就分为⼀下⼏步:找到状态和选择 -> 明确 dp 数组/函数的定义 -> 寻找状态之间的关系。

无后效性【未来与过去无关】:如果给定某一阶段的状态,则在这一阶段以后过程的发展不受这阶段以前各段状态的影响。

最优子结构性质: 大问题的最优解可以由小问题的最优解推出。

参考文献

什么是动态规划(Dynamic Programming)?动态规划的意义是什么?