LeetCode53. Maximum Subarray-python(easy) DP思想

題目來源:

   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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章