1. 程式人生 > >演算法進階--動態規劃

演算法進階--動態規劃

動態規劃演算法實現最長公共子序列問題

從斐波那契數列看動態規劃

斐波那契數列:

def fibnacci(n):
    if n == 1 or n==2:
        return 1
    else:
        return fibnacci(n-1)+fibnacci(n-2)
# print(fibnacci(100))

#---------------------------------------------------------
# 遞迴會出現子問題的重複計算
# f(6) = f(5)+f(4)
# f(5) = f(4)+f(3)
# f(4) = f(3)+f(2) # f(3) = f(2)+f(1) # 動態規劃(DP)的思想=最優子結構==>遞推式子(需要自己總結) + 重複子問題 def fibnacci_no_recurision(n): f = [0,1,1] if n>2: for i in range(n-2): num = f[-1]+f[-2] f.append(num) print(f) return f[n] # n==3 i==0 num=2 f=[0,1,1,2]
# 子問題重複 # n==4 i==0 num=2 f=[0,1,1,2];i==1 num=3 f=[0,1,1,2,3] print(fibnacci_no_recurision(4))

鋼條切割問題(遞推式需要自己總結出來)

-----------------------------------------------------------------------------------------------------------------------------------------------------

鋼條切割問題:自頂向下實現 

 時間複雜度O(2^n)---不採取

遞迴演算法由於重複求解相同子問題,效率低

動態規劃的思想:

  每一次子問題只求解一次,儲存求解結果

  之後需要此問題時,只需要查詢儲存的結果

 

鋼條切割問題:自底向上實現