一、什么是动态规划?
这里引用维基百科的解释: https://zh.wikipedia.org/wiki/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92
- 动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。
- 动态规划只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。
关于动态规划更有趣的解释可以看https://www.zhihu.com/question/23995189上关于动态规划的介绍
简单一句总结就是:动态规划是一种空间换时间提高效率,由求解若干个子问题的最优解最终推导出全局最优解,减少重复子问题求解的一个算法思想。
核心重点:
- 空间换时间:用一些存储空间将子问题求解结果保存下来,避免再次计算
- 求解子问题:需要写一个推导式或者是说写一个状态转移方程,让最终全局最优解能够由子问题推出
- 减少重复问题:很多可以用动态规划的问题用递归或者回溯法解决,但是用动态规划可以减少一些重复子问题的求解,加快最终结果的推导。
PS: 关于回溯法小白可以参考这篇文章https://zhuanlan.zhihu.com/p/54275352
二、动态规划的分类
动态规划的分类大致可以分为以下几种问题(这里暂时列举3个,因为目前就写到这里,后面再慢慢更):
- 背包问题 (0/1背包,完全背包)
- leecode 139题 拆分单词 https://leetcode-cn.com/problems/word-break/
- leecode 416题 分割等和子集 https://leetcode-cn.com/problems/partition-equal-subset-sum/
- leecode 416题 分割等和子集 https://leetcode-cn.com/problems/target-sum/
- leecode 322题 零钱兑换 https://leetcode-cn.com/problems/coin-change/
- 股票最大利润(leecode四道股票问题,都蛮有意思的)
- 回文串
三、动态规划的练习
动态规划是公司常考的重点,也是一个很重要的算法思想,最近正好我在为求职做准备,因此会更新自己的博客, 将自己的一些代码一些算题经验进行分享,在此推荐大家去刷leecode,里面有专门的动态规划分类,可以通过此去更好地学习掌握动态规划。