zoukankan      html  css  js  c++  java
  • 两段不相邻子段和之和最大

    头条一面第二次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);
    }
    
  • 相关阅读:
    slf4j中的MDC
    redis incr incrby decr decrby命令
    Java接口响应超时监控
    JDK1.7.0_45源码阅读<java.lang.Boolean>
    Debug JDK变量显形
    Java全角、半角字符的关系以及转换
    模型选择
    经验风险最小化
    支持向量机(下)
    支持向量机(上)
  • 原文地址:https://www.cnblogs.com/kuronekonano/p/11135667.html
Copyright © 2011-2022 走看看