题意:给你一个数组,让你找三个中间点x,y,z使得sum[(0,x-1)]-sum[(x,y-1)]+sum[(y,z-1)]-sum[(z,n)]最大
题解:暴力y的取值,然后做半段和右半段贪心找x和z即可,复杂度O(n^2)
#include<stdio.h>
#include<algorithm>
using namespace std;
#define ll long long
ll n,a[5005],x,y,z,ans,sum[5005];
int main(void)
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];
}
for(int i=1;i<=n+1;i++)
{
ll tmp=-1e18-1000,xx=0,yy=0,zz=0,res=0;
for(int j=1;j<=i;j++)
{
if(sum[i-1]-(sum[i-1]-sum[j-1])>tmp)
tmp=sum[i-1]-(sum[i-1]-sum[j-1]),xx=j-1,yy=i-1;
}
res+=tmp;tmp=-1e18-1000;
for(int j=i+1;j<=n+1;j++)
if(sum[n]-sum[i-1]-(sum[n]-sum[j-1])>tmp)
tmp=sum[n]-sum[i-1]-(sum[n]-sum[j-1]),zz=j-1;
res+=tmp;//printf("%lld %lld %lld %lld\n",res,xx,yy,zz);
if(res>ans) ans=res,x=xx,y=yy,z=zz;
}
printf("%lld %lld %lld\n",x,y,z);
return 0;
}