1481:Maximum sum
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below:
t1 t2 d(A) = max{ ∑ai + ∑aj | 1 <= s1 <= t1 < s2 <= t2 <= n } i=s1 j=s2
Your task is to calculate d(A).
输入
-
The input consists of T(<=30) test cases. The number of test cases (T) is given in the first line of the input.
Each test case contains two lines. The first line is an integer n(2<=n<=50000). The second line contains n integers: a1, a2, ..., an. (|ai| <= 10000).There is an empty line after each case.
输出
- Print exactly one line for each test case. The line should contain the integer d(A). 样例输入
-
1 10 1 -1 2 2 3 -3 4 -4 5 -5
样例输出
-
13
大概的想法:l:选第i个的最大和 然后枚举一遍就可以了(来自网上抄的答案)
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int T,n,ans;
int a[500010],l[500010],r[500010];
void clr()
{
memset(a,0,sizeof(a));
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
}
int main()
{
cin>>T;
while(T--)
{
cin>>n;
ans=-1<<29;
clr();
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
if(l[i-1]<0)
l[i]=a[i];
else l[i]=l[i-1]+a[i];
for(int i=2;i<=n;i++)
l[i]=max(l[i],l[i-1]);
for(int i=n;i>=1;i--)
if(r[i+1]<0)
r[i]=a[i];
else r[i]=r[i+1]+a[i];
for(int i=n-1;i>=1;i--)
r[i]=max(r[i],r[i+1]);
for(int i=2;i<=n;i++)
ans=max(ans,l[i-1]+r[i]);
printf("%d\n",ans);
}
return 0;
}