题目:
输入一组整数,求出这组数字子序列和中的最大值,只要求出最大子序列的和,不必求出最大值对应的序列。
最大子序列和:整数序列A1, A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大。
例如:
序列:-2, 11, -4, 13, -5, 2, -5, -3, 12, -9,则最大子序列和为21。
最大子序列和:整数序列A1, A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大。
例如:
序列:-2, 11, -4, 13, -5, 2, -5, -3, 12, -9,则最大子序列和为21。
序列:0, -3, 6, 8, -20, 21, 8, -9, 10, -1, 3, 6, 5,则最大子序列和为43。
算法思路为:求最大子序列和时,序列的起点不能为负数。因为当a[i]为负数时,那么总有为正数的a[i+1]在它的前面做起点更加合适。所以当和为负数时我们将其赋值为0,将它抛弃掉(此时和也可以认为是序列中的一个数,但它是负数,不适合做起点。我们将其抛弃)从下一个正数开始计算。全负数是一种特殊情况 ,此时我们选择求绝对值最小的那一个。
代码如下:
#include<iostream>
#include<vector>
using namespace std;
int maxsum(int a[],int n)
{
int sum=0;
int maxsum=-10000;
for(int i=0;i<n;i++)
{
sum+=a[i];
if(sum>maxsum) maxsum=sum;
else if(sum<0) sum=0;
}
return maxsum;
}
int main()
{
int a[100];
int n=0;
while(cin>>a[n])
{
n++;
}
cout<<maxsum(a,n);
return 0;
}