原题链接:http://poj.org/problem?id=2479
题意:对整数串S,求其两个不相交的子串s1、s2,使得s1+s2的值最大
思路:见代码注释
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<stack>
#include<algorithm>
#include<vector>
#define y1 y12345
#define mx 50005
#define inf 0x3f3f3f3f
#define LL long long
#define ULL unsigned long long
#define mod 1000000007
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int max(int a,int b){
if(a>b)return a;
return b;
}
int a[mx],dp1[mx],dp2[mx];
int main(){
int t;
cin>>t;
while(t--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
memset(dp1,0,sizeof(dp1));
memset(dp2,0,sizeof(dp2));
dp1[n+1]=dp1[0]=-inf;
dp2[n+1]=dp2[0]=-inf;
//LCS,dp1[i]表示从1-i的最大子段连续和
for(int i=1;i<=n;i++)dp1[i]=max(dp1[i-1]+a[i],a[i]);
for(int i=n;i>0;i--)dp2[i]=max(dp2[i+1]+a[i],a[i]);
//dp2[i]表示从i-n的最大字段连续和
for(int i=1;i<=n;i++)dp1[i]=max(dp1[i-1],dp1[i]);
for(int i=n;i>0;i--)dp2[i]=max(dp2[i+1],dp2[i]);
int ans=-1*inf;
//[1,i]的最大子段连续和[i+n]的最大字段连续和,枚举i比较
for(int i=1;i<n;i++){
int k=dp1[i]+dp2[i+1];
ans=max(ans,k);
}
cout<<ans<<endl;
}
return 0;
}