poj 2479 Maximum sum

// c++输入输出超时
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=50005;
int T,n;
int a[maxn];
int l[maxn];
int r[maxn];
int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		for(int i=0;i<n;i++){
			scanf("%d",&a[i]);
		}
		l[0]=a[0];
		for(int i=1;i<n;i++){
			if(l[i-1]<0){
				l[i]=a[i];
			}
			else{
				l[i]=l[i-1]+a[i];
			}
		}
		//此时left[i]为左端包括i的最大子串和 
		for(int i=1;i<n;i++){
			l[i]=max(l[i],l[i-1]);
		}
		r[n-1]=a[n-1];
		for(int i=n-2;i>=0;i--){
			if(r[i+1]<0){
				r[i]=a[i];
			}
			else{
				r[i]=r[i+1]+a[i];
			}
		}
		for(int i=n-2;i>=0;i--){
			r[i]=max(r[i],r[i+1]);
		}
		int res=-0x3f3f3f3f;
		/*for(int i=0;i<n-1;i++){
			res=max(res,l[i]+r[i+1]);
		}*/
		for(int i=1;i<n;i++){
			res=max(res,l[i-1]+r[i]);
		}
		printf("%d\n",res);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/skykone1/article/details/88958904