这道题和一维最大连续子和很想,题目不难。
#include <iostream>
#include <limits>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define ZHAO_DEBUG 0
const int size = 50000 + 10;
int f[size];
int sum[size];
int L_maxsum[size] , L_min[size];
int R_maxsum[size] , R_min[size];
int main()
{
int T , n;
scanf("%d" , &T);
while(T-- > 0)
{
scanf("%d" , &n);
sum[0] = sum[n+1] = 0;
for(int i = 1 ; i <= n ; ++i)
{
scanf("%d" , f + i);
sum[i] = sum[i-1] + f[i];
}
L_maxsum[0] = f[1]; L_min[0] = 0;
for(int i = 1 ; i <= n ; ++i)
{
int t = sum[i] - L_min[i-1];
L_maxsum[i] = t > L_maxsum[i-1] ? t : L_maxsum[i-1];
L_min[i] = sum[i] < L_min[i-1] ? sum[i] : L_min[i-1];
}
R_maxsum[n+1] = f[n]; R_min[n+1] = 0;
for(int i = n ; i >= 1 ; --i)
{
int t = (sum[n] - sum[i-1]) - R_min[i+1];
R_maxsum[i] = t > R_maxsum[i+1] ? t : R_maxsum[i+1];
R_min[i] = (sum[n] - sum[i-1]) < R_min[i+1] ? (sum[n] - sum[i-1]) : R_min[i+1];
}
int m = numeric_limits<int>::min();
for(int i = 1 ; i < n ; ++i)
{
int t = L_maxsum[i] + R_maxsum[i+1];
if(t>m) m = t;
}
cout << m << endl;
}
return 0;
}