題目來源:
https://leetcode.com/problems/maximum-subarray/discuss/20193/DP-solution-and-some-thoughts
題目分析:
本題的意思很簡單,即給出一個數列,輸出這個數列的最大字段和。比如:[−2,1,−3,4,−1,2,1,−5,4],最大子段和是[4,-1,2,1]答案是6。
顯然,這是一個優化問題,通常可以用DP來解決。DP意思是動態規劃。動態規劃程序設計是對解最優化問題的一種途徑、一種方法,而不是一種特殊算法。不像前面所述的那些搜索或數值計算那樣,具有一個標準的數學表達式和明確清晰的解題方法。動態規劃程序設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,因而動態規劃的設計方法對不同的問題,有各具特色的解題方法,而不存在一種萬能的動態規劃算法,可以解決各類最優化問題。因此除了要對基本概念和方法正確理解外,必須具體問題具體分析,以豐富的想象力去建立模型,用創造性的技巧去求解。
動態規劃算法的基本思想是:將待求解的問題分解成若干個相互聯繫的子問題,先求解子問題,然後從這些子問題的解得到原問題的解;對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案保存起來,讓以後再次遇到時直接引用答案,不必重新求解。動態規劃算法將問題的解決方案視爲一系列決策的結果,與貪婪算法不同的是,在貪婪算法中,每採用一次貪婪準則,便做出一個不可撤回的決策;而在動態規劃算法中,還要考察每個最優決策序列中是否包含一個最優決策子序列,即問題是否具有最優子結構性質。
當涉及到DP時,我們首先要弄清楚的是子問題的格式(或每個子問題的狀態),當我們試圖提出遞歸關係時,子問題的格式可能會有所幫助。本題,我們可以這樣想:爲了計算sum(0,i),你有2個選擇,一是對a[i]加上原先計算的sum(0,i-1),或者不加,這取決於前面的sum是正值還是負值。如果爲正,則加上,否則不加。
解決代碼:
class Solution:
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
sum=0;ma=nums[0]
for i in range(len(nums)):
if(sum<0):
sum=nums[i]
else:
sum+=nums[i]
ma=max(ma,sum)
return ma