【leetcode】53. 最大子数组和(python)动态规划

【leetcode】53. 最大子数组和(python)动态规划,第1张


推荐学习大佬题解【经典动态规划问题(理解「无后效性」)】

思路分析:

    以nums[i]结尾的连续子数组的最大和是多少?
    nums[0]: f(0) = -2, cur_max_sum = -2  # 初始
    nums[1]: f(1)= max((-2) + 1, 1) = max(-1, 1) = 1, cur_max_sum = 1
    nums[2]: f(2)= max(f(1) + (-3), -3) = max(-2, -3) = -2, cur_max_sum = -2
    nums[3]: f(3)= max(f(2) + 4, 4) = max(2, 4) = 4, cur_max_sum = 4
    nums[4]: f(4)= max(f(3) + -1, -1) = max(3, -1) = 3, cur_max_sum = 3
    nums[5]: f(5)= max(f(4) + 2, 2) = max(5, 2) = 5, cur_max_sum = 5
    nums[6]: f(6)= max(f(5) + 1, 1) = max(6, 1) = 6, cur_max_sum = 6
    nums[7]: f(7)= max(f(6) + (-5), -5) = max(1, -5) = 1, cur_max_sum = 1
    nums[8]: f(8)= max(f(7) + 4, 4) = max(5, 4) = 5, cur_max_sum = 5
    总的再取最大和 ==> 6
    转移方程:f(i) = max(f(i-1) + nums[i], nums[i])
    result = max(f(0), f(1), f(2), f(3), ...)
写法一:
class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums:
            return 0
        n = len(nums)
        if n == 1:
            return nums[0]
        dp = [0 for i in range(n)]
        dp[0] = nums[0]
        max_sum = nums[0]
        for i in range(1, n):
            dp[i] = max(dp[i - 1] + nums[i], nums[i])
            if dp[i] > max_sum:
                max_sum = dp[i]
        return max_sum
写法二:
class Solution(object):
    def maxSubArray(self, nums):
        size = len(nums)
        if size == 0:
            return 0
        dp = [0 for _ in range(size)]
        dp[0] = nums[0]
        for i in range(1, size):
            if dp[i - 1] >= 0:
                dp[i] = dp[i - 1] + nums[i]
            else:
                dp[i] = nums[i]
        return max(dp)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/716214.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存