题目链接: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, 0, sizeof(dp)) ;
memset(a, 0, sizeof(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 ;
}
}
#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, 0, sizeof(dp)) ;
memset(a, 0, sizeof(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 ;
}
}