1. 程式人生 > 實用技巧 >dp連續子陣列的最大和求解

dp連續子陣列的最大和求解

dp連續子陣列的最大問題求解:


思路:

1.dp[i] 表示以第i個元素為末尾元素的子序列最大和

2.只有一個元素時,該元素即最大

3.當dp[i-1]為負數時,對第i個元素產生負影響;為正數時,比較加上第i個元素值是否變大,dp[i] 為nums[i]與dp[i-1]+nums[i]中較大的元素

狀態方程:

dp[i] = nums[i] ;dp[i-1] <=0

dp[i] = max(dp[i-1]+nums[i],nums[i]);dp[i-1] > 0


例題:

輸入: nums = [-2,1,-3,4,-1,2,1,-5,4]

輸出: 6

解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        dp = [0 for i in range(len(nums))]
        if len(nums) == 1:   # 只有一個元素,選定該元素
            return nums[0]
        dp[0] = nums[0]      
        for i in range(1,len(nums)):
            if dp[i-1] <= 0:   # 該元素之前的序列和產生負影響
                dp[i] = nums[i]
            else:
                dp[i] = max(dp[i-1] + nums[i],nums[i])  # 為正影響時,判斷加上該元素是否得到更大的和
        mmax = dp[0]
        for i in range(1,len(dp)):  # 取出dp中最值
            if dp[i] > mmax:
                mmax = dp[i]
        return mmax