• 两段不相邻子段和之和最大


    头条一面第二次GG,肚子不疼了,人蠢了。

    题目:给一个数组,求出两段 不相邻也不相交的子段和 之和 最大。

    如果是单段,那么就是一个普通的最大子段和问题。
    然而分成了两段,也是简单的一批
    两次遍历求出从前缀和后缀的最大子段和,即1到n每个位置的最大子段和,以及n到1每个位置的最大子段和,这样就可以分区间考虑了。

    最后一次,遍历枚举整个数组,求第i位为区间间隔的L【i-1】+R【i+1】的最大值。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e5+7;
    int l[maxn],a[maxn],r[maxn],n;
    int main()
    {
        scanf("%d",&n);
        for(int i=0;i<n;++i)scanf("%d",&a[i]);
        int sum=0,tmp=-99999999;
        for(int i=0;i<n;++i)
        {
            sum+=a[i];
            if(sum>tmp)tmp=sum;
            if(sum<0)sum=0;
            l[i]=tmp;
        }
        sum=0,tmp=-99999999;
        for(int i=n-1;i>=0;--i)
        {
            sum+=a[i];
            if(sum>tmp)tmp=sum;
            if(sum<0)sum=0;
            r[i]=tmp;
        }
        int ans=-9999999;
        for(int i=1;i<n-1;++i) ans=max(ans,l[i-1]+r[i+1]);
        printf("%d
    ",ans);
    }
    
  • 相关阅读:
    插入排序(C语言版)
    2015蓝桥杯分机号(C++C组)
    2015蓝桥杯二项式
    2016蓝桥杯报纸页数(C++C组)
    区块链
    C语言学生管理系统完善版
    数据结构队列
    C语言数据结构队列
    C语言数据结构栈
    javascript 事件
  • 原文地址:https://www.cnblogs.com/kuronekonano/p/11135667.html
Copyright © 2020-2023  润新知