nyoj 745

点击打开题目链接

写了好久

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
long long v[50005],d1[50005],d2[50005];
int main(){
	long long n,j,i,maxx,minn,sum;
	while(scanf("%lld",&n)!=EOF){
		memset(d1,0,sizeof(d1));
		memset(d2,0,sizeof(d2));
		sum=0;
		for(i=0;i<n;i++){
			scanf("%lld",&v[i]);
			sum+=v[i];
		}	
		for(j=0;j<n-1;j++){
			d1[j+1]=max(v[j+1],d1[j]+v[j+1]); //求连续最大和 
			d2[j+1]=min(v[j+1],d2[j]+v[j+1]); //求连续最小和 
		}	
		maxx=0;	minn=0;//分别存放最大最小的和 
		for(i=0;i<n;i++){
			maxx=max(maxx,d1[i]);  
			minn=min(minn,d2[i]);
		}	
		//对于一个环,从断点开始分别以最大最小和相加到末尾
		//两结果必有一个是对于环的最大最小值和,即其一成立 
		printf("%lld\n",max(maxx,sum-minn));
	} 
	return 0;
}


你可能感兴趣的:(nyoj 745)