题目大意:求最大连续子序列和,输出最大的和以及这个子序列的开始值和结束值。如果所有数都小于0,那么认为最大的和为0,并且输出首尾元素
主要思路:temp为临时最大和,sum为最大和,temp+a[i],temp不断与元素a[i]加和,在此过程中,如果temp>sum,就更新sum的值,始终保持sum为当前已经遍历序列的最大值,当然,如果temp<0时,说明当前序列和已经为负值,只能拉低之后的序列和,故在此点将temp重新赋值为0,重复之前的步骤
tempindex为临时左节点变量
#include<bits/stdc++.h>
using namespace std;
int n, lef, righ, sum = -1, temp = 0, tempindex = 0;
int main()
{
cin >> n;
int a[n];
lef = 0;
righ = n - 1;
for(int i = 0; i < n; i++)
{
cin >> a[i];
temp += a[i];
if(temp < 0)
{
temp = 0;
tempindex = i + 1;
}
else if(sum < temp)
{
sum = temp;
lef = tempindex;
righ = i;
}
}
if(sum < 0) sum = 0;
printf("%d %d %d", sum, a[lef], a[righ]);
}