hello大家好 我是大家的学习成长小伙伴
动态规划,大家肯定都听过这个名词,这个是很经典的一个解决问题的思路,也是很有技巧的,一般大厂也喜欢问这种类型的问题
今天我们一起来学习一下动态规划到底是个什么
什么是动态规划?
动态规划(英语:Dynamic programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
动态规划常常适用于有重叠子问题[1]和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。
动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。
通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化(en:memoization)存储,以便下次需要同一个子问题解之时直接查表。
这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。
核心思想
动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。
动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。
在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。
按照定义来看,动态规划就是把一个大问题然后拆分成很多小问题,这个本身是没啥问题的,其实啊,我个人觉得这不是动态规划的核心思想
事实上是任何大问题都能拆解成许多小问题,一个大问题之所以能用动态规划来解决,并不是因为它可以拆解成很多小问题,这不是关键
动态规划的本质不在于是递推或是递归,也不需要纠结是不是内存换时间,本质是解决的这些小问题是否能够被重复调用,这就是问题是否可以用动态规划解决的要素
我们先来看一个最熟悉的例子
斐波那契数列(Fibonacci polynomial)
计算斐波那契数列(Fibonacci polynomial)的一个最基础的算法是,直接按照定义计算(函数递归):
function fib(n)
if n = 0 or n = 1
return n
return fib(n − 1) + fib(n − 2)
当n=5时,fib(5)的计算过程如下:
fib(5)
fib(4) + fib(3)
(fib(3) + fib(2)) + (fib(2) +