1.本题不算难,是浙大数据结构教材书上例题的变形。
2.注意坑点:题目要求输出的是最大子列和的sum以及第一个和最后一个数,而不是输出下标。
其次就是如果所有数字都是负数,才输出sum为0,也有可能有子列的和就是0,这时候是认为存在最大子列和的,所以最后输出的时候if判断条件是MaxSum>=0
3.题目要求输出i,j最小的情况,因此在更新MaxSum的时候,判断条件是>而不是>=
#include <stdio.h>
int main(int argc, char const *argv[])
{
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++)scanf("%d",&a[i]);
int MaxSum = -1,ThisSum = 0;
//st,ed存放MaxSum下标,x,y存放ThisSum下标
int st=0,ed=0,x=0,y=0;
for(int i=0;i<n;i++){
ThisSum += a[i];
y = i; //y每次都要更新
if(ThisSum > MaxSum){
MaxSum = ThisSum;
st = x;
ed = y;
}
else if(ThisSum < 0){
ThisSum = 0;//子列小于零了更新ThisSum和x
x = i+1;
}
}
if(MaxSum>=0)printf("%d %d %d",MaxSum,a[st],a[ed]);
else printf("%d %d %d",0,a[0],a[n-1]);
return 0;
}