描述
题解
同最大子段和非常类似。不同的是,该题中的最大子段和可能出现在首尾处,在这种情况下,就相当于将整个数组取反,那么取反后的数组的最大子段和必然出现在中间部分,这种情况下的最大子段和为‘数组之和与最大子段和的加和’
。
代码
#include <iostream>
#include<stdio.h>
#define maxn 50005
long long sum=0,ans=0;
long long a[maxn],tempa[maxn];
long long dp[maxn];
int n;
using namespace std;
long long DP(long long a[],int n){
long long max_=0;
dp[0]=max((long long)0,a[0]);
for(int i=1;i<n;i++){
dp[i]=max((long long)0,dp[i-1])+a[i];
max_=max(max_,dp[i]);
}
return max_;
}
int main()
{
while(scanf("%d",&n)==1){
for(int i=0;i<n;i++){
scanf("%lld",&a[i]);
sum+=a[i];
tempa[i]=-a[i];
}
ans=max(DP(a,n),sum+DP(tempa,n));
printf("%lld\n",ans);
}
return 0;
}