|-定義:將原問題拆解成若干子問題,同時保存子問題的答案,使得每個子問題只求解一次,最終獲得原問題的答案
|-解決的問題:
遞歸問題->重疊子問題 -> 記憶化搜索(自頂向下的解決問題)
-> 動態規劃(自底向上的解決問題)
# 遞歸的的斐波那契數列解決方法 時間複雜度O(2^n)
def fib(n):
if n == 0:
return 0
if n == 1:
return 1
return fib(n-1) + fib(n-2)
# print(fib(50))
# 動態規劃 先解決小數據量的 再層層遞推的解決大數據量級的問題 時間複雜度O(n)
def fib2(n):
memo = [-1 for x in range(n+1)]
memo[0] = 0
memo[1] = 1
for i in range(2, n+1):
memo[i] = memo[i-1]+memo[i-2]
return memo[n]
# print(fib2(50))
# 記憶化搜索
MAXSIZE = 1000
memo = [-1 for i in range(MAXSIZE)]
def fib3(n):
if n == 0:
return 0
if n == 1:
return 1
if memo[n] == -1:
memo[n] = fib3(n-1) + fib3(n-2)
return memo[n]
print(fib3(40))
可見 動態規劃和記憶化搜索的思路是比較接近的。