51Nod 1050循环数组最大子段和

描述

在这里插入图片描述

题解

同最大子段和非常类似。不同的是,该题中的最大子段和可能出现在首尾处,在这种情况下,就相当于将整个数组取反,那么取反后的数组的最大子段和必然出现在中间部分,这种情况下的最大子段和为‘数组之和与最大子段和的加和’

代码

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_27690765/article/details/88956484
今日推荐