80分 错了点一,玄关
查看原帖
80分 错了点一,玄关
632311
huyangmu楼主2023/9/20 16:50
#include<bits/stdc++.h>
using namespace std;
int n,a[200005],dp[200005],dp1[200005],sum=0,ans=0,maxx=-1e9,maxn[200005],maxn1[200005],maxn2=-0x3f;
int dp2[200005],dp3[200005],maxn3[200005],maxn4[200005],maxn5=0x7f7f7f7f;
int main (){
	cin>>n;
	memset(maxn,-0x7f,sizeof(maxn));
	memset(maxn1,-0x7f,sizeof(maxn1));
	memset(maxn3,0x7f7f7f7f,sizeof(maxn3));
	memset(maxn4,0x7f7f7f7f,sizeof(maxn4));
	for (int i=1;i<=n;++i){
		cin>>a[i];
		sum+=a[i];
		if (a[i]<0) ++ans;
	}
	if (ans==n){
		for (int i=1;i<=n;++i) maxx=max(maxx,a[i]);
		cout<<maxx*2<<endl;
		return 0;
	}
	for (int i=1;i<=n;++i){
		dp[i]=max(dp[i-1]+a[i],a[i]);
		maxn[i]=max(maxn[i-1],dp[i]);
	}
	for (int i=n;i>=1;--i){
		dp1[i]=max(dp1[i+1]+a[i],a[i]);
		maxn1[i]=max(maxn1[i+1],dp1[i]);
	}
	for (int i=1;i<=n;++i) maxn2=max(maxn[i]+maxn1[i],maxn2);
	for (int i=1;i<=n;++i){
		dp2[i]=min(dp2[i-1]+a[i],a[i]);
		maxn3[i]=min(maxn3[i-1],dp2[i]);
	}
	for (int i=n;i>=1;--i){
		dp3[i]=min(dp3[i+1]+a[i],a[i]);
		maxn4[i]=min(maxn4[i+1],dp3[i]);
	}
	for (int i=1;i<=n;++i) maxn5=min(maxn3[i]+maxn4[i],maxn5);
	cout<<max(maxn2,(sum-maxn5))<<endl;
	return 0;
}
2023/9/20 16:50
加载中...