http://poj.org/problem?id=2479
给你一个数列,问你他们最大的两个连续子段和 最大值为多少。
一个是好求得,两个的时候,可以先计算一个,然后在求另一个。
为什么呢,因为 动态规划的最优子结构性质。
两个最大,一个当然也最大咯。(是会出现连个相连的情况的,题目中也没有排除这种情况、)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
int dp[maxn];
int a[maxn];
const int inf=1e8;
int main()
{ int t;
int m;
scanf("%d",&t);
while(t--){
//if(!t) break;
memset(dp,0,sizeof(dp));
scanf("%d",&m);
for(int i=0;i<m;i++)
scanf("%d",&a[i]);
ll sum=0;
ll max1=-inf;
for(int i=0;i<m;i++){
sum+=a[i];
if(max1<sum)
max1=sum;
dp[i]=max1;
if(sum<0)
sum=0;
}
//for(int i=0;i<t;i++)
//cout<<dp[i]<<endl;
sum=0;
ll max2=-inf;
max1=-inf;
for(int i=m-1;i>=1;i--){
sum+=a[i];
if(max1<sum)
max1=sum;
if(sum<0)
sum=0;
max2=max(max2,max1+dp[i-1]);
}
cout<<max2<<endl;
}
return 0;
}