每日一題,每日一練 31最大子序和(把思維逆轉過來的動態規劃)

  1. 最大子序和 給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。

示例:

輸入: [-2,1,-3,4,-1,2,1,-5,4], 輸出: 6 解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。

這是一道很經典的動態規劃題了,那麼既然是最大連續子序,連續雖然防止了我們用貪心獲取全部正值,但是在這裏也補足了我們可以挨個遍歷的條件,這裏用到動態規劃的思想,對於每個數,除了dp【0】=nums【0】,我們把思維逆轉過來,不要想加上這個數子序是否會增大,而是利用連續的思想,思考對在這裏結束的子序來講,之前的子序對於和的增大有沒有提供幫助,換句話說。如果之前的子序加上我還沒有我本身大,那麼之前的連續子序對和的貢獻爲零,我們就可以拋棄掉之前連續子序的累加,改爲從這裏開始疊加新的連續子序。於是,我們的狀態轉移方程爲dp【i】=max(num【i】+dp【i-1】,num【i】),這樣我們在dp中得到的每個dp【i】是nums中在以i爲結尾的最大子序和,我們只要找到其中的最大值就可,而不需要輸出子序本身。
代碼如下:

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        dp=[0 for i in range(len(nums))]
        dp[0]=nums[0]
        for i in range(1,len(nums)):
            dp[i]=max(dp[i-1]+nums[i],nums[i])
        return max(dp)

把思維逆轉過來,成步堂!

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