題目:
有乙個序列[3,-5, 9,0,-2,8,-3,9,5,-9,-2,8],取其中不相鄰子串行,求可能的最大值是多少?
思路:
用動態規劃來求解。
對於最後乙個元素,可以分成兩種情況,取還是不取。如果取,那麼我們在8的基礎上再加上前10個元素組成的序列求得的最大值,如果不取,那麼我們考慮前11個元素組成的序列即可。假設opt(i)表示(序列長度為i)根據題意所求的最大值。
則有,opt(12) = max(opt(10)+8, opt(11))
將式子一般化可得,opt(i) = max(opt(i-2)+8, opt(i-1))
下面用遞迴和迭代兩種方法用**實現:
import numpy as np
arr =[3,-5, 9,0,-2,8,-3,9,5,-9,-2,8]
defrec_opt
(arr,i):
if i==0:
return arr[0]
elif i==1:
return max(arr[0],arr[1])
else:
a = rec_opt(i-2)+arr[i]
b = rec_opt(i-1)
return max(a,b)
defdp_opt
(arr):
opt = np.zeros(len(arr))
opt[0] = arr[0]
opt[1] = max(arr[0],arr[1])
for i in range(2,len(arr)):
a = opt[i-2]+arr[i]
b = opt[i-1]
opt[i] = max(a,b)
return opt[-1]
動態規劃演算法
一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...
動態規劃演算法
動態規劃 通過把原問題分解為相對簡單的子問題來求解複雜問題。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。演算法總體思想 演算法的基本步驟 演算法的基本要素 最優子結構 重疊子問題 備忘錄方法 問題描述 子串行 公共子串行 最長公共子串行 lcs 問題 問題分析 動態規劃求解lcs問題 最長...
動態規劃演算法
動態規劃演算法的思路 動態規劃法即 dynamic programming method dp 是系統分析中的種常用方法。動態規劃法是20世紀50年代由貝爾曼 r.bellman 等人提出的,用來解決多階段決策過程問題的一種最優化方法。多階段決策過程是指把研究問題分成若干個相互聯絡的階段,由每個階段...