給定乙個整數陣列 nums ,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。
示例:
輸入: [-2,
1,-3
,4,-
1,2,
1,-5
,4],
輸出:6
解釋: 連續子陣列 [4,-
1,2,
1] 的和最大,為 6。
高階:
如果你已經實現複雜度為 o(n) 的解法,嘗試使用更為精妙的分治法求解。
python實現:
class
solution
(object):
defmaxsubarray
(self, nums):if
not nums:
return
0 dp =
[nums[0]
] res = dp[0]
for i in
range(1
,len
(nums)):
max(dp[i-1]
+ nums[i]
, nums[i]))
if dp[-1
]> res:
res = dp[-1
]return res
這就是一種用動態規劃解決問題的思路。我們把問題分解為多個階段,每個階段對應乙個決策。我們記錄每乙個階段可達的狀態集合(去掉重複的),然後通過當前階段的狀態集合,來推導下乙個階段的狀態集合,動態地往前推進。這也是動態規劃這個名字的由來,你可以自己體會一下,是不是還挺形象的?
大部分動態規劃能解決的問題,都可以通過回溯演算法來解決,只不過回溯演算法解決起來效率比較低,時間複雜度是指數級的。動態規劃演算法,在執行效率方面,要高很多。儘管執行效率提高了,但是動態規劃的空間複雜度也提高了,所以,很多時候,我們會說,動態規劃是一種空間換時間的演算法思想。
我理解的幾種演算法:
貪心:一條路走到黑,就一次機會,只能哪邊看著順眼走哪邊!
回溯:一條路走到黑,無數次重來的機會,還怕我走不出來?
動態規劃:擁有上帝視角,手握無數平行宇宙的歷史存檔, 同時發展出無數個未來 (versioned archive view)
———————————————————————————
分享乙個動態規劃的url:
動態規劃 什麼是動態規劃?
先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...
mysql動態規劃 動態規劃
動態規劃 能夠動態規劃的問題具有以下特點 可分解成規模更小的子問題 子問題的結果可復用 關鍵是要理解狀態轉移方程的含義就好啦!數字三角形 問題描述 在數字三角形尋找從頂到底的路徑,使得路徑經過的數字之和最大。規定每一步只能往左下或右下走,求出最大路徑和。遞迴解法 include include us...
《動態規劃》 ACM 動態規劃例題詳解
描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 圖1 圖1給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最大的和。注意 路徑上的每一步只能從乙個數走到下一層上和它最近的左邊的那個數或者右邊的那個數。輸...