题目链接: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 ;
    }
}

 

posted on 2011-09-25 22:36  追逐.  阅读(157)  评论(0编辑  收藏  举报