自学内容网 自学内容网

动态规划 —— 子数组系列-最大子数组和

1. 最大子数组和

题目链接:

53. 最大子数组和 - 力扣(LeetCode)icon-default.png?t=O83Ahttps://leetcode.cn/problems/maximum-subarray/description/


2. 算法原理

状态表示:以某一个位置为结尾或者以某一个位置为起点

  

dp[i]表示:以i位置为结尾的所有子树中的最大和

2. 状态转移方程

  

dp[i]分为两种情况:1. 长度为1        nums[i]

  

                                 2. 长度大于1        dp[i-1] + nums[i]

  

本题的状态转移方程为:max(nums[i] ,  dp[i-1] + nums[i])

  

3. 初始化 :把dp表填满不越界,让后面的填表可以顺利进行

  

我们可以在左边加上一个虚拟节点,为了不影响最终结果,那么就可以把这个虚拟节点初始化为0

  

本题的下标映射关系:下标统一往后移动一位

  

4. 填表顺序 

  

本题的填表顺序是:从左往右

5. 返回值 :题目要求 + 状态表示     

  

本题的返回值是:整个dp表里的最大值


3.  代码 

  动态规划的固定四步骤:1.  创建一个dp表

                                        2. 在填表之前初始化

                                        3. 填表(填表方法:状态转移方程)

                                        4. 确定返回值

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n=nums.size();
        vector<int>dp(n+1);

        int ret=INT_MIN;//定义一个最小值与数组里比较
        for(int i=1;i<=n;i++)
        {
            dp[i]=max(nums[i-1],dp[i-1]+nums[i-1]);
            ret=max(ret,dp[i]);
        }
        return ret;
    }
};


未完待续~


原文地址:https://blog.csdn.net/hedhjd/article/details/143734343

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!