最大子序列和问题

问题描述:给定一个A1,A2,…,AN(可能有负数),求其中连续的的子序列的和的最大值为多少?
例:-2,11,-4,13,-5,-2的最大子序列和为20,从11到13。

该问题使用动态规划思想:(leetcode中有该题)
对每个元素考虑是单独构成一个子序列还是加入到前面的子序列中去。

A[i] = max(A[i-1]+A[i],A[i]) i>=1

简单推导如下:

  1. 对于[-2,11,-4,13,-5,-2]来说,第一个元素由于前面没有元素,所以A[0] = -2;
  2. 对于第二个元素,是和-2构成一个子序列还是从自身开始构建子序列,这取决于加入前面的子序列后的值和单独成序列后那个值大,加入子序列值为9,不加而自己成序列为11,所以选择后者,A[1]=11;
  3. 不断的这样最后数组元素变为[-2,11,7,20,15,13]。从中找出最大的即可。
  4. 这样就可以写出代码了,时间复杂度为O(n),因为只需遍历一次数组,最大元素在处理过程中进行统计。
#include<bits/stdc++.h>
using namespace std;
int MaxSubsequenceSum(vector<int> A) {
	int MaxRes = A[0];
    for(int i = 1;i<A.size();++i){
        A[i] = std::max(A[i],A[i-1]+A[i]);
        MaxRes = MaxRes > A[i] ? MaxRes: A[i];
    }
    return MaxRes;
}
int main(){
    cout<<MaxSubsequenceSum({-2,11,-4,13,-5,-2})<<endl;
    return 0;
}
/*
输出:
20
*/

本题的变种有好多题,但思想都一个样。如哪里有问题,还请指出!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值