题目
思路
最大序列和的一般做法 + dp前缀最大值 + dp尾缀最大值 + 枚举分界点
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 5e4+10;
int a[N];
int um[N], dm[N], s;
int main()
{
int t;
cin >> t;
um[0] = INT_MIN;
while(t--)
{
int n;
cin >> n;
s = 0;
for(int i = 1; i <= n; i++)
{
cin >> a[i];
s = max(s, 0) + a[i];
um[i] = max(um[i-1], s);
}
dm[n+1] = INT_MIN;
s = 0;
for(int i = n; i >= 1; i--)
{
s = max(s, 0) + a[i];
dm[i] = max(dm[i+1], s);
}
int res = INT_MIN;
for(int i = 1; i+1 <= n; i++)
{
res = max(res, um[i] + dm[i+1]);
}
cout << res << "\n";
}
}