http://poj.org/problem?id=2479
给出n个数,从中取出两端连续的区间,求他们的sum, 让你求出最大的sum,区间不能相交。
左边来一次 最大连续区间和,右边来一次最大连续区间和
dp_left[i]对应从左到右计算,从1到第i个位置的最大和
dp_right[i]对应从右到左计算,从n到第i个位置的最大和
那么for一遍所有的 dp_left[i]+ dp_right[i+1] 取一个最大的
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
int tm[50005];
int max(int a,int b){return a<b?b:a;}
int contrary_tm[50005];
int dp_left[50005];
int dp_right[50005];
int n,m;
void cal(int st,int ed,int dp[],int ttt[])
{
int i,maxx=-1000000;
int sum=0;
for (i=st;i<=ed;i++)
{
sum+=ttt[i];
if (sum>maxx)
maxx=sum;
dp[i]=maxx;
if (sum <0) sum=0;
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
int i;
for (i=1;i<=n;i++)
{
scanf("%d",&tm[i]);
contrary_tm[n-i+1]=tm[i];
}
cal(1,n,dp_left,tm);
cal(1,n,dp_right,contrary_tm);
for (i=1;i<=n/2;i++)
swap(dp_right[i],dp_right[n-i+1]);
int maxx=dp_left[1]+dp_right[2];
for (i=1;i<n;i++)
maxx=max(maxx,dp_left[i]+dp_right[i+1]);
printf("%d\n",maxx);
}
return 0;
}