Maxumum Sum (多个最大子串)
-
题目链接:Maxumum Sum
-
思路:决策第i个位置, 分为i之前最大的子段和, i之后最大子段和
#include<bits/stdc++.h>
#define maxn 50005
#define INF 0x3f3f3f3f
#define mst(a) memset(a,0,sizeof a)
#define ll long long
using namespace std;
// 决策第i个位置, 分为i之前最大的子段和, i之后最大子段和
ll A[maxn];
ll dp_p[maxn],dp_n[maxn];
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
mst(dp_p);
mst(dp_n);
scanf("%d",&n);
for(int i = 1; i<=n; i++)
{
scanf("%lld",&A[i]);
//构造前缀和
A[i] += A[i-1];
}
// 前一段
ll minn = min(0ll,A[1]);
dp_p[1] = A[1];
for(int i = 2; i<=n; i++)
minn = min(minn,A[i]),dp_p[i] = max(dp_p[i-1],A[i]-minn);
// 后一段
ll maxx = A[n];
dp_n[n] = A[n] - A[n-1];
for(int i = n-1; i>=1; i--)
maxx = max(maxx,A[i]),dp_n[i] = max(dp_n[i+1],maxx - A[i-1]);
ll ans = -1e10;
for(int i = 1; i<n; i++)
ans = max(ans, dp_p[i]+dp_n[i+1]);
printf("%d\n",ans);
}
return 0;
}