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);
    }
    
  • 相关阅读:
    对this的浅解
    Java设计模式---工厂模式学习笔记
    MyBatis入门
    Java设计模式---单例模式学习笔记
    java设计模式--七大原则
    Servlet request常用方法
    maven中导入jdbc的坑
    Servlet生命周期
    JQuery选择器
    Test
  • 原文地址:https://www.cnblogs.com/kuronekonano/p/11135667.html
Copyright © 2011-2022 走看看