剑指2--连续子数组的最大和1

我觉得有必要,谈论一下为什么这道题的dp公式是:
dp[i] = max(dp[i-1] + array[i], array[i]);
dp[i]的含义就是,加上第i个数组元素,当前最大和的子数组的和是多少,必须是加上加上第i个数组元素的。由于第i个数组元素,可能为正,也可能为负,那么为正,自然最大和是增长的,为负则最大和是有损的,也就是当前最大的子数组加上array[i]之后,这个子数组和需要付出的代价。
当然如果加上这个array[i]子数组付出的代价太大,大到不如不加,那么最大子数组就有两种情况:不管dp[i-1]为正为负,那么加上array[i](为负值)肯定都会更小:
1)第1种情况是,dp[i-1]为正,那么加上array[i],dp[i]比array[i]自己大,但不知道大多少,只要前面是正的,加上前面dp[i-1]对dp[i]就合算;
2)第2种情况是,dp[i-1]为负,那么加上array[i],比array[i]自己还小,加上前面dp[i-1]对dp[i]非常不合算,还不如不加dp[i-1],前面一堆负数就是个累赘,所以单算array[i]自己作为dp[i]是合适的,大子数组和在array[i]之后的概率比较大。

同理,array[i]为正数时,也需要论dp[i-1]的正负数情况:

if array[i] > 0: // array[i]为正数
    if (dp[i-1] > 0)
        dp[i] =  dp[i-1] + array[i];
    else:
        dp[i] =  array[i];
else:  // array[i]为负数
     if (dp[i-1] > 0)
        dp[i] =  dp[i-1] + array[i];
    else:
        dp[i] =  array[i];

所以:dp[i] = max(dp[i-1] + array[i], array[i]);

class Solution {
public:
    int FindGreatestSumOfSubArray(vector<int> array) {
        int size = array.size();
        int sum[size];
        sum[0] = array[0];
        int max1 = sum[0];
        for (int i = 1; i < size; i++) {
            sum[i] = max(sum[i-1] + array[i], array[i]);
            if (max1 < sum[i]) {
                max1 = sum[i];
            }
        }
        return max1;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值