问题描述:给定一个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
简单推导如下:
- 对于[-2,11,-4,13,-5,-2]来说,第一个元素由于前面没有元素,所以A[0] = -2;
- 对于第二个元素,是和-2构成一个子序列还是从自身开始构建子序列,这取决于加入前面的子序列后的值和单独成序列后那个值大,加入子序列值为9,不加而自己成序列为11,所以选择后者,A[1]=11;
- …
- 不断的这样最后数组元素变为[-2,11,7,20,15,13]。从中找出最大的即可。
- 这样就可以写出代码了,时间复杂度为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
*/
本题的变种有好多题,但思想都一个样。如哪里有问题,还请指出!!!