dp sum[i] = max{sum[i] + a[i], a[i]}
left right maxn 记录最长左右边和最大值
#include<iostream>
using namespace std;
int a[20005];
int main()
{
int cases;
int n;
int left,right;
int l ,r;
int sum;
int maxn;
scanf("%d",&cases);
int num=1;
while(cases--)
{
scanf("%d",&n);
for(int i=1;i<n;i++)
{
scanf("%d",a+i);
}
sum=a[1];
maxn=a[1];
left=1;right=1;
l=1;r=1;
for(int i=2;i<n;i++)
{
if(sum>=0)
{
sum+=a[i];
r=i;
}else{
l=i;
r=i;
sum=a[i];
}
if(sum>maxn||(sum==maxn && (r-l)>(right-left))) //每次比较sum 和maxn,若sum>maxn,或者相等并且距离更长 则更新maxn,left,right
{
maxn=sum;
left=l;
right=r;
}
}
if(maxn<=0)
{
printf("Route %d has no nice parts\n",num++);
}else {
printf("The nicest part of route %d is between stops %d and %d\n",num++,left,right+1);
}
}
return 0;
}