如何利用动态规划去提升自己的算法能力

一、什么是动态规划?

这里引用维基百科的解释: https://zh.wikipedia.org/wiki/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92

  1.   动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。
  2.   动态规划只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。

关于动态规划更有趣的解释可以看https://www.zhihu.com/question/23995189上关于动态规划的介绍

简单一句总结就是:动态规划是一种空间换时间提高效率,由求解若干个子问题的最优解最终推导出全局最优解,减少重复子问题求解的一个算法思想。

核心重点:

  • 空间换时间:用一些存储空间将子问题求解结果保存下来,避免再次计算
  • 求解子问题:需要写一个推导式或者是说写一个状态转移方程,让最终全局最优解能够由子问题推出
  • 减少重复问题:很多可以用动态规划的问题用递归或者回溯法解决,但是用动态规划可以减少一些重复子问题的求解,加快最终结果的推导。

PS: 关于回溯法小白可以参考这篇文章https://zhuanlan.zhihu.com/p/54275352

二、动态规划的分类

  动态规划的分类大致可以分为以下几种问题(这里暂时列举3个,因为目前就写到这里,后面再慢慢更):

三、动态规划的练习

动态规划是公司常考的重点,也是一个很重要的算法思想,最近正好我在为求职做准备,因此会更新自己的博客, 将自己的一些代码一些算题经验进行分享,在此推荐大家去刷leecode,里面有专门的动态规划分类,可以通过此去更好地学习掌握动态规划。

猜你喜欢

转载自www.cnblogs.com/zhangshinan/p/12298669.html