动态规划一直被认为是最难理解的一种算法思想,什么重叠子问题、动态转移方程、最优子结构等等,一听就高深莫测,没有往下学习下去的动力。接下了我会更新一系列的文章来把动态规划这个算法思想尽量去讲明白,希望对你在以后的学习生活中提供一些帮助。没有关注的同学先点个关注吧。
一、初识动态规划
废话不多说,我们直接先上一个经典的例子。那就是耳熟能详的斐波那契数列问题。我们先来看一下问题的定义。
斐波那契数列的定义如下:
斐波那契数列指的是这样一个数列 0,1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,.....
它以递归的方法来定义:
F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)
复制代码
- 递归解决:
这个例子最直观的方法就是用递归的方式来实现,毕竟斐波那契数列是用递归来定义的。我们来看一下代码实现。
def fibs(n):
if n<2:
return n
return fibs(n-1)+fibs(n-2)
复制代码
这样是不是很简单。我们接下来看一下调用的递归树。我们以fibs(6)为例。
其中每个结点表示要计算的斐波那契数列的第几项,我们可以从上图发现,会出现许多重复计算的问题,比如fib(4)就计算了两次。这样