和POJ 2479 一样,还是最大连续子和的问题,用dp可以加速(d[i]表示一i结尾的最大子和)。
#include <iostream>
#include <limits>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int size = 100000 + 10;
int f[size];
int L[size] , R[size];
int LMax[size] , RMax[size];
int main()
{
int n;
while(scanf("%d" , &n) && n)
{
L[0] = -1; LMax[0] = numeric_limits<int>::min();
for(int i = 1 ; i <= n ; ++i)
{
scanf("%d" , f + i);
L[i] = L[i-1] < 0 ? f[i] : L[i-1] + f[i];
LMax[i] = L[i] > LMax[i-1] ? L[i] : LMax[i-1];
}
R[n+1] = -1; RMax[n+1] = numeric_limits<int>::min();
for(int i = n ; i >= 1 ; --i)
{
R[i] = R[i+1] < 0 ? f[i] : R[i+1] + f[i];
RMax[i] = R[i] > RMax[i+1] ? R[i] : RMax[i+1];
}
int m = numeric_limits<int>::min();
for(int i = 1 ; i < n ; ++i)
{
int t = LMax[i] + RMax[i+1];
if(t > m) m = t;
}
cout << m << endl;
}
return 0;
}