最大子序和

题目链接:最大子序和

假设 \(nums\) 的数组长度是 \(n\),下标从 \(0\)\(1\)
我们用 \(a_{i}\) 代表 \(nums[i]\) ,用 \(dp[i]\)代表以第\(i\)个数结尾的【连续子数组的最大和】,那么很显然我们要求的答案就是:

\(max{dp[i]} 0 \leq i \leq n-1\)
因此我们只需要求出每个位置的\(dp[i]\),然后返回\(dp\)数组中的最大值即可。那么我们如何求解\(dp[]\)呢?我们可以考虑\(a_{i}\)单独成为一段
还是加入\(dp[i-1]\)对应的那一段,这取决于\(a_{i}\)\(dp[i-1] + a_{i}\)的大小,我们希望获得一个比较大的,于是可以写出这样的动态规划
转移方程:

dp[i] = max{dp[i-1] + \(a_{i},a_{i}\)}

AC代码如下

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int len = nums.size();
        if(len == 0){
            return 0;
        }else if(len == 1){
            return nums[0];
        }

        vector<int> dp(len);
        dp[0] = nums[0];
        for(int i=1;i<len;i++){
            dp[i] = max(dp[i-1] + nums[i],nums[i]);
        }
        int maxNum = dp[0];
        for(int i=0;i<len;i++){
            if(dp[i] > maxNum){
                maxNum = dp[i];
            }
        }
        return maxNum;
    }
};

posted @ 2020-10-03 14:15  focusDing  阅读(125)  评论(0编辑  收藏  举报