zoukankan      html  css  js  c++  java
  • b_51_循环数组的最大子段和(作差法求和)

    求序列如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。

    思路
    最大和可能存在的位置:

    • 数组中:这一部分直接dp求解
    • 数组尾部+首部:这一部分用作差法求解(总和减去最小和)
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll N=5e5,inf=0x3f3f3f3f;
    ll n,s,a[N],mi[N],mx[N],maxv=-inf,minv=inf;
    int main() {
        std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
        cin>>n; for (int i=1; i<=n; i++) cin>>a[i],s+=a[i];
        for (int i=1; i<=n; i++) {  //最大字段和
            mx[i]=max(mx[i-1]+a[i], a[i]);
            maxv=max(maxv,mx[i]);
        }
        for (int i=1; i<=n; i++) {  //最小字段和
            mi[i]=min(mi[i-1]+a[i], a[i]);
            minv=min(minv,mi[i]);
        }
        cout<<max(s-minv,maxv);
        return 0;
    }
    

    其他可行算法:把数组复制一份到末尾,求解RMQ

  • 相关阅读:
    随机出题问题
    简读《构建之法》提问
    大二下第一次课后作业
    大道至简第七第八章读后感
    继承与接口动手动脑
    大道至简第六章读后感
    数组里的随机数问题
    大道至简第五章读后感
    输入法的用户界面
    搜索水王
  • 原文地址:https://www.cnblogs.com/wdt1/p/13841295.html
Copyright © 2011-2022 走看看