思路:1、无环,直接求连续子数组的最大和
2、有环,先求和然后减去连续子数组的最小和
注意:如果所有的值都是负数,要用无环情况。
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int a[500005];
int dpMax[500005];
int dpMin[500005];
int main(){
int n;
scanf("%d",&n);
int num=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
dpMax[i]=0;
dpMin[i]=0;
if(a[i]<0)
num++;
}
dpMax[0]=0;
dpMin[0]=0;
int Max1=-1e9;
int Min1=1e9;
int sum;
for(int i=1;i<=n;i++)
{
sum+=a[i];
dpMax[i]=max(dpMax[i-1]+a[i],a[i]);
dpMin[i]=min(dpMin[i-1]+a[i],a[i]);
if(dpMax[i]>Max1)
Max1=dpMax[i];
if(dpMin[i]<Min1)
Min1=dpMin[i];
}
int Max;
if(num==n) //注意如果全是负数要用无环求最大值
Max=Max1;
else
Max=max(Max1,sum-Min1);
printf("%d\n",Max);
return 0;
}