描述
给出 n 个整数序列(可能为负数)组成的序列 a1, a2,...,an,求该序列形如
的子段和的最大值。当所有整数均为负数时,定义最大子段和为 0 。
输入描述
多测试用例。每个测试用例 2 行:
第一行是序列的个数 n(0<n≤10000),第二行是 n 个整数。
输出描述
每个测试用例一行结果:最大子段和。
一道简单的oj题,话不多说,上代码
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n;
while(scanf("%d",&n)!=EOF){
int a[n+1],b[n+1];//a为字段,b为字段和
int best=0;//最大解
for(int i=1;i<=n;i++){
cin>>a[i];
if(i==1)//如果只有一个字段
b[i]=a[i];//易错,这里是==b[i]
else{
//如果已有的(字段和)加上当前字段后变小了
//就抛弃,从下一个字段重新开始
//best存放每一个字段和的最大值,最后输出best
b[i]=max(a[i],b[i-1]+a[i]);//易错,这个地方是与a[i]比较
if(b[i]>best)
best=b[i];
}
}
//易错,这里是在for循环后才输出
cout<<best<<endl;
}
return 0;
}