poj 2479 Maximum sum

题目链接:http://poj.org/problem?id=2479

 

        基础DP题,跟以前做的最大子段和差不多。数据量比较大,一开始用cin,cout输入输出,超时,改成scanf就好了。

 

#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>

using  namespace std ;
int dp[ 50005], a[ 50005] ;
int main(){
     // fstream cin("x.in") ;
     int t, n, i ;
    memset(dp,  0sizeof(dp)) ;
    memset(a,  0sizeof(a)) ;
    scanf( " %d ", &t) ;
     while(t--){
        scanf( " %d ", &n) ;
         int ans = - 9999999 ;
         int tmax = - 9999999 ;
         int sum =  0 ;
         for(i= 1; i<=n; i++){      // 从左到右最大子段和
            scanf( " %d ", &a[i]) ;
            dp[i] = max(dp[i- 1]+a[i], a[i]) ;
        }
         for(i=n; i> 1; i--){       // 从右到左
            sum = sum< 0?a[i]:sum+a[i] ;
            tmax = max(sum, tmax) ;
            ans = max(dp[i- 1]+tmax, ans) ; // 选取两段和的最大值
        }
        cout << ans << endl ;
    }
}

 

你可能感兴趣的:(poj)