Problem Description
给出一个数组,数组首尾相连,询问最大连续子段和为多少。
Input
首先输入一个T表示T (1<=T<=50) 组数据,然后每组数据首先输入一个n (1<=n<=1e5) 表示有n个数字,然后输入n个数字(题目保证数字范围在 int 内),表示所求数组。
Output
数组最大的连续子段和。
Sample Input
1
7
10 -100 1 -2 -5 3 4
Sample Output
17
Hint
全是负数的时候,最大的连续子段和为 0。
Source
#include<iostream>
#include<cstring>
#include<iomanip>
#include<stdio.h>
#include<algorithm>
using namespace std;
# define inf 0x3f3f3f3f
# define ll long long
const int maxn = 200000+100;
int a[maxn];
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
ll sum=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
ll tmp1=0,ans1=0,ans2=0;
for(int i=1;i<=n;i++){
tmp1+=a[i];
ans1=max(ans1,tmp1);
if(tmp1<0)tmp1=0;
}
tmp1=0;
for(int i=1;i<=n;i++){
tmp1+=(-a[i]);
ans2=max(ans2,tmp1);
if(tmp1<0)tmp1=0;
}
printf("%lld\n",max(sum+ans2,ans1));
}
return 0;
}