1 题目及要求
1.1 题目描述
给定k个整数的序列{N1,N2,...,Nk },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= k。最大连续子序列是所有连续子序中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{11,-4,13},最大连续子序列和即为20。如果所有整数均为负数,则最大子序列和为0。
解题思路:
运用动态规划的思想:MaxSum[i] = Max{ MaxSum[i-1] + A[i], A[i]}
2 解答
2.1 代码
#include<iostream>
#include<vector>
#include<assert.h>
using namespace std;
int max_subSet(vector<int> &v){ //O(n),动态规划
int n=v.size();
assert(n>0);
int currentSum=0,maxSum=0;
for(int i=0;i<n;++i){
currentSum+=v[i];
if(currentSum>maxSum) maxSum=currentSum;
else if(currentSum<0) currentSum=0;
}
return maxSum;
}
int main(){
vector<int> v={-2, 11, -4, 13, -5, -2};
cout<<max_subSet(v)<<endl;
return 0;
}