Language:
Description
Give you N integers a1, a2 ... aN (|ai| <=1000, 1 <= i <= N).
![]() You should output S. Input
The input will consist of several test cases. For each test case, one integer N (2 <= N <= 100000) is given in the first line. Second line contains N integers. The input is terminated by a single line with N = 0.
Output
For each test of the input, print a line containing S.
Sample Input 5 -5 9 -5 11 20 0 Sample Output 40 Source
POJ Monthly--2005.08.28,Li Haoyuan
|
题意:从一个序列中挑两段是其两段和最大。
思路:设dp1[i]表示i之前的最大字段和,dp2[i]表示i之后的之后的最大字段和,b[i]表示以a[i]结尾的最大连续和,只不过第一段循环是从前往后,第二段是
从后往前。详见代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=100000+100;
const int inf=0x3fffffff;
int n;
int a[MAXN],b[MAXN],dp1[MAXN],dp2[MAXN];
int main()
{
//freopen("text.txt","r",stdin);
while(~scanf("%d",&n) && n)
{
dp1[0]=dp2[n+1]=-inf;
b[0]=b[n+1]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=max(0,b[i-1])+a[i];
dp1[i]=max(dp1[i-1],b[i]);
}
for(int i=n;i>=1;i--)
{
b[i]=max(0,b[i+1])+a[i];
dp2[i]=max(dp2[i+1],b[i]);
}
int ans=-inf;
for(int i=1;i<n;i++)
ans=max(ans,dp1[i]+dp2[i+1]);
printf("%d\n",ans);
}
return 0;
}