51Nod1050 循环数组最大子段和

Posted sz-wcc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51Nod1050 循环数组最大子段和相关的知识,希望对你有一定的参考价值。

Problem

N个整数组成的循环序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a[n],a[1],a[2]这样的序列)。当所给的整数均为负数时和为0。
例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。

Solution

最大字段和最大,或者去掉中间某个最小字段和剩下的最大。

Code

#include<stdio.h>
#include<set>
#include<iostream>
#include<algorithm>
typedef long long ll;
typedef long double ld;
typedef double db;
#define io_opt ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
int n;
ll a[50020];
ll fmn[50020],fmx[50020],mn=0,mx=0,sum;
int main() {
    io_opt;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum+=a[i];
        fmx[i]=max(a[i],fmx[i-1]+a[i]);
        mx=max(mx,fmx[i]);
        fmn[i]=min(a[i],fmn[i-1]+a[i]);
        mn=min(mn,fmn[i]);
    }
    cout<<max(mx,sum-mn);
    return 0;
}

以上是关于51Nod1050 循环数组最大子段和的主要内容,如果未能解决你的问题,请参考以下文章

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

51nod 1050 循环数组最大子段和环形DP/最大子段和/正难则反

51Nod1050 循环数组最大子段和

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

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

[51NOD1959]循环数组最大子段和(dp,思路)