Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below:
t1 t2
d(A) = max{ ∑ai + ∑aj | 1 <= s1 <= t1 < s2 <= t2 <= n }
i=s1 j=s2
#include<iostream> #include<algorithm> #include<string.h> using namespace std; int a[50001],dpleft[50001],lmax[50001],dpright[50001],rmax[50001]; int main() { int times,n,i,ans; cin>>times; while(times--) { memset(dpleft,0,sizeof(dpleft)); memset(lmax,0,sizeof(lmax)); memset(dpright,0,sizeof(dpright)); memset(rmax,0,sizeof(rmax)); cin>>n; for (i=1;i<=n;i++) cin>>a[i]; dpleft[1]=a[1];lmax[1]=a[1]; for (i=2;i<=n;i++) { dpleft[i]=max(dpleft[i-1]+a[i],a[i]); lmax[i]=max(lmax[i-1],dpleft[i]); } dpright[n]=a[n];rmax[n]=a[n]; for (i=n-1;i>=0;i--) { dpright[i]=max(dpright[i+1]+a[i],a[i]); rmax[i]=max(rmax[i+1],dpright[i]); } ans=lmax[1]+rmax[2]; for (i=2;i<=n-1;i++) ans=max(ans,lmax[i]+rmax[i+1]); cout<<ans<<endl; } return 0; }