动态规划(一)Fibonacci数列
动态规划(DP)与分治法类似,也是将待求解问题分成若干子问题。不同的是,适用于动态规划求解的问题,经分解得到的子问题往往不是互相独立的。而用分治法求解时往往耗费指数时间,有时有些子问题被重复计算了很多次。这样浪费了大量的时间和空间。此时就需要用到动态规划:用一个表记录所有已解决的子问题的答案。不管以后是否用到,只要计算过,就填入表中。在需要时找出已求得的答案,这样就避免了大量重复的计算
动态规划适用于解最优化问题,通常有3个步骤:
(1)找出最优解的性质,并刻画其结构特征
(2)递归的定义最优解(找出递归式)
(3)以自底向上的方式计算出最优解
一、基本要素
1.最优子结构
当前问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质
2.重叠子问题
用递归算法自顶向下解此问题时,每次产生的子问题并不总是新的问题。对于每个子问题只解一次,然后将子问题的解保存起来,当再次解子问题时,只需要查看其结果。
*二、备忘录方法
与动态规划相似,备忘录方法也保存子问题的答案。与动态规划不同的是,备忘录方法自顶向下的,而动态规划是自底向上的
一般来讲,当问题的子问题都至少要解一次时,动态规划要优于备忘录方法。优势在于,动态规划没有任何多余的计算
当问题中部分子问题不需要求解时,使用备忘录方法更好。因为该方法只解出那些需要求解的问题
三、Fibonacci数列
n>=2时,f(n)=f(n-1)+f(n-2)(递归表达式),f(0)=1,f(1)=1。
算法实现
def Fibonacci(n):
if n < 2:
return n
visit = [1,1]
for i in range(2, n+1):
visit.append(visit[i-1] + visit[i-2])
return visit[n]
算法分析
这个数列可以用递归的方式进行求解 return f(n-1) + f(n-2)
但是用递归的解法的时间复杂度太大,T(n)=O(n!)。而使用动态规划去解的时间复杂度T(n)=O(n),显然动态规划解这道题效率更高

浙公网安备 33010602011771号