题目很简单,dp问题,就是求最大子段和问题。代码如下:
#include<stdio.h>
#include<string.h>
#define MAXN 50005
int num[MAXN] ;
int lsum[MAXN] ;
int rsum[MAXN] ;
int n ;
void work(){
int i ;
scanf("%d" , &n) ;
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) ;
}
int main(){
int t ;
scanf("%d" , &t) ;
while(t--){
work() ;
}
return 0 ;
}