这个题目是最大连续子序列和的扩展,在此基础上加了起始点和终止点。
(1)终止点的确定,就是每当更新一次Max的值时,更新一下终止点。
(2)起始点的确定,当Thissum<0时,给一个暂时起始点的标记,然后当Max的值更新时,将起始点的值一起更新。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int t;
int n;
int a[100005];
int main()
{
scanf("%d",&t);
for (int j=1;j<=t;j++)
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int sum=0;
int Max=a[1];
int s=1,e=1,ts=1,te=n;
for (int i=1;i<=n;i++)
{
sum+=a[i];
if(sum>Max)
{
e=i;
Max=sum;
s=ts;
}
if(sum<0)
{
ts=i+1;
sum=0;
}
}
printf("Case %d:\n",j);
printf("%d %d %d\n",Max,s,e);
if(j<t)
printf("\n");
}
return 0;
}