1.问题描述
给定一个有n(n≥1)个整数的序列,要求求出其中最大连续子序列的和
例如:
序列(-2,11,-4,13,-5,-2)的最大子序列和为20
序列(-6,2,4,-7,5,3,2,-1,6,-9,10,-2)的最大子序列和为16
2. 解题思路
如果一趟扫描中遇到负数,当前子序列和thisSum将会减小,若thisSum为负数,表明前面已经扫描的那个子序列可以抛弃了,则放弃这个子序列,重新开始下一个子序列的分析,并置thisSum为0。 若这个子序列和thisSum不断增加,那么最大子序列和maxSum也不断增加,maxSum始终为最大值
#include <bits/stdc++.h>
using namespace std;
int maxSubSum(int a[], int n){
int maxSum = 0, thisSum = 0;
for(int i = 0; i <n; i++){
thisSum += a[i];
if(thisSum < 0)
thisSum = 0;
if(maxSum < thisSum)
maxSum = thisSum;
}
return maxSum;
}
int main(){
int n;
cin >> n;
int a[n];
for(int i = 0; i < n; i++)
cin >> a[i];
cout << maxSubSum(a, n);
return 0;
}