leetcode刷题-- 4. 动态规划

动态规划思路

参考
状态转移方程:
明确「状态」-> 定义dp数组/函数的含义 -> 明确「选择」-> 明确 base case

53最大子序和

53
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

状态:此题变量是不同位置在改变,即下标i。

dp[i]含义:每个元素位置i处的最大和,我之前以为还要判断nums[i]<=0,如果True,则pd[i] = pd[i-1],否则pd[i] = pd[i-1]+nums[i],那么还有pd[i-1]小于0的情况。这是因为没有理解dp数组在这道题中的含义。其实正确说法应该是以nums[i]结尾的连续数组最大和。

选择:加上i-1处时的最大和即pd[i-1]+nums[i],或者不加,i处最大就是nums[i],因为要以nums[i]结尾,所以有这两种选择。

base case:变量(状态)i=0时,pd[i] = nums[0]。

那么状态转移方程:pd[i] = max(pd[i-1]+nums[i], nums[i])

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

猜你喜欢

转载自www.cnblogs.com/ivan-blog/p/12363369.html