Maximum sum(poj 2479)

时间:2023-03-09 02:19:58
Maximum sum(poj 2479)
题意:给一段数列,将这个数列分成两部分,使两部分的最大子段和的和最大,输出和
/*
看数据没想到是(O)n的算法,求出从前向后的最大子段和和从后向前的最大子段和,
然后枚举断点。
第一次提交不小心折在数组最小值的赋值上……
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#define M 50010
#define INF 1000000000
using namespace std;
int a[M],f1[M],f2[M],v1[M],v2[M],n;
int main()
{
int T;scanf("%d",&T);
while(T--)
{
memset(f1,,sizeof(f1));
memset(f2,,sizeof(f2));
memset(v1,,sizeof(v1));
memset(v2,,sizeof(v2));
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
for(int i=;i<=n;i++)
f1[i]=max(f1[i-]+a[i],a[i]),v1[i]=max(f1[i],v1[i-]);
for(int i=n;i>=;i--)
f2[i]=max(f2[i+]+a[i],a[i]),v2[i]=max(f2[i],v2[i+]);
int ans=-INF;
for(int i=;i<n;i++)
ans=max(ans,v1[i]+v2[i+]);
printf("%d\n",ans);
}
return ;
}