您的位置:首页 > 其它

sicily 1091. Maximum Sum

2015-11-08 18:24 423 查看


1091. Maximum Sum


Constraints

Time Limit: 1 secs, Memory Limit: 32 MB


Description

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).


Input

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)


Output

Print exactly one line for each test case. The line should contain the integer d(A).


Sample Input


1

10
1 -1 2 2 3 -3 4 -4 5 -5



Sample Output


13

#include<bits/stdc++.h>
using namespace std;

//这道题就是把序列从中间切成两部分,然后分别算这两部分的最大子序列
int a[100008];
//从开头到当前的最大子序列
int dp[80008];
//从当前到结尾的最大子序列
int dp2[80008];
int main(){
int t;
scanf("%d",&t);
int tmp = t;
while(t--){
int n;
int sum = 0;
scanf("%d",&n);
for(int i = 0;i<n;i++){
scanf("%d",&a[i]);
}
//先算dp
dp[0] = sum = a[0];
for(int i = 1;i<n;i++){
if(sum<0){
sum = 0;
}
sum += a[i];
if(sum>dp[i-1]){
dp[i] = sum;
}
else{
dp[i] = dp[i-1];
}
}
//再算dp2
dp2[n-1] = sum = a[n-1];
for(int i = n-2;i>=0;i--){
if(sum<0){
sum = 0;
}
sum += a[i];
if(sum>dp2[i+1]){
dp2[i] = sum;
}
else{
dp2[i] = dp2[i+1];
}
}
//这题指明了一定是两个子序列,我一开始加上了如下这句以为可以组合成一个子序列然后就GG了,还有一开始maxn初始化的太大,如果全是负数也是GG
//int maxn = max(dp2[0],dp[n-1]);
int maxn = -999999999;
for(int i = 0;i<n-1;i++){
maxn = max(maxn,dp[i]+dp2[i+1]);
}
printf("%d\n",maxn);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: