设置maxi[i],表示包含a[i]元素及其前缀的最大值
maxi[i-1]<0时, maxi[i]=a[i]
maxi[i-1]>=0时 ,maxi[i]=maxi[i-1]+a[i];
其中,maxi[0]设置成-1,只是为了方便编写程序,不需要再对第一次操作进行初始化等操作
#include<iostream>
using namespace std;
int k,s1,s,e;
//判断是否全负
bool is_Negative(long int a[]){
for(int i=1;i<=k;i++)
if(a[i]>=0){
return false;
}
return true;
}
int main()
{
long int a[10002],maxi[10002]={},maxsum=0;
cin>>k;
for(int i=1;i<=k;i++) cin>>a[i]; //之所以i从1开始,是为了下面令maxi[0]=-1,方便编写
if(is_Negative(a)) //如果全负,则直接输出0
{
cout<<0<<" "<<a[1]<<" "<<a[k];
return 0;
}
maxi[0]=-1; //令maxi[0]=-1,其实相当于一个空节点,没有意义,但是可以方便程序编写
for(int i=1;i<=k;i++)
{
if(maxi[i-1]>=0) maxi[i]=maxi[i-1]+a[i];
else maxi[i]=a[i],s1=a[i];
if(maxsum<maxi[i]) //取下标最小的连续区间,所以用< 而不是≤
{
maxsum=maxi[i];
e=a[i];
s=s1;
}
}
cout<<maxsum<<" "<<s<<" "<<e;
return 0;
}