这题与前面的2479相同,都是数字子段和的dp问题,直接采用O(n)的算法即可。代码如下:
#include<stdio.h>
#include<string.h>
#define MAXN 100005
int num[MAXN] ;
int lsum[MAXN] ;
int rsum[MAXN] ;
int n ;
bool work(){
int i ;
if(scanf("%d" , &n)==EOF || n == 0){
return 0 ;
}
for(i = 1 ; i <= n ; i ++){
scanf("%d" , &num[i]) ;
}
memset(lsum , 0 , sizeof(lsum)) ;
memset(rsum , 0 , sizeof(rsum)) ;
lsum[1] = num[1] ;
for(i = 2 ; i <= n ; i ++){
if(lsum[i-1] > 0){
lsum[i] = lsum[i-1] + num[i] ;
}
else
lsum[i] = num[i] ;
}
rsum[n] = num[n] ;
for(i = n - 1 ; i >= 1 ; i--){
if(rsum[i+1] > 0){
rsum[i] = rsum[i+1] + num[i] ;
}
else
rsum[i] = num[i] ;
}
int nmax = -1000000 ;
int temp = -1000000 ;
for(i = 1 ; i < n ; i ++){
if(temp < lsum[i])
temp = lsum[i] ;
if(nmax < temp + rsum[i+1])
nmax = temp + rsum[i+1] ;
}
printf("%d\n" , nmax) ;
return 1 ;
}
int main(){
while(work())
;
return 0 ;
}