解题思路:
需要维护六个变量:
- 当前子段和长度
- 当前子段和的起点
- 当前子段和的终点
- 最大子段和长度
- 最大子段和的起点
- 最大子段和的终点
如果当前子段和不小于0,就继续向后遍历,同时和最大子段和长度比较更新.
如果小于0,那么重置当前子段和.
代码
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[1000];
int i;
for(i = 1;i <= n;i++)
scanf("%d",&a[i]);
int start_index = 1;
int max_start_index = 0;
int max_end_index = 0;
int temp = 0;
int max = 0;
for(i = 1;i <= n;i++)
{
temp += a[i];
if(max < temp)
{
max_start_index = start_index;
max_end_index = i;
max = temp;
}
if(temp < 0)
{
start_index = i+1;
temp = 0;
}
}
printf("The Max Interval Sum is %d\n",max);
for(i = max_start_index;i <= max_end_index;i++)
if(i == max_start_index)
printf("%d",i);
else
printf("+%d",i);
return 0;
}