zoukankan      html  css  js  c++  java
  • 求整数数组中和最大的子数组的和

    郑云飞--韩亚华 

     这个问题的复杂性和不确定让我们让我们想到了枚举,求出每一个子数组的和,但这样我们我们程序的时间复杂度

    将会非常高,于是我们想把办法简化它。首先我们将数组里连续的正数和负数就和,这样我们将得到一个正负相间的

    整数数组。然后再对正整数数组求最大子数组,这样最大子数组必定是两头为正,有奇数个元素的数组,让后再对这

    样的数组枚举。这样不能在数量级简化时间复杂度,但也会使计算得到一定简化。一下会方法:

    int maxsubarray(int a[],int n)
    {
        int *temp;
        int newlong=0;
        int k=1;//标志新数组元素的正负
        int t=0;
        int e=n;
        int max=0;
        int add=0;
        while(a[t]<=0)
        {
            t++;
        }
        while(a[e-1]<=0)
        {
            e--;
        }
        temp=new int[n];
        for(int j=0;j<n;j++)
        {
            temp[j]=0;
        }
        for(int i=t;i<e;i++)
        {
            if(k==1)
            {
                if(a[i]>0)
                    temp[newlong]=temp[newlong]+a[i];
                else
                {
                    k=-1;
                    newlong++;
                }
            }
            if(k==-1)
            {
                if(a[i]<=0)
                    temp[newlong]=temp[newlong]+a[i];
                else
                {
                    k=1;
                    newlong++;
                    i--;
                }
            }
    
        }//得到新数组
        /*for(int x=0;x<=newlong;x++)
        {
            cout<<temp[x]<<" ";
        }*/
        for(int element=1;element<=newlong+1;element=element+2)//对新数组枚举
        {
            for(int start=0;start<=newlong+1-element;start=start+2)
            {
                for(int i=0;i<element;i++)
                {
                    add=add+temp[start+i];
                }
                if(max<add)
                {
                    max=add;
                }
                add=0;
    
            }
        }
        return max;
    
    }
    测试函数:
    int main()
    {
        int a[10]={2,4,6,-2,-78,9,8,-1,9,-3};
        int themax;
        themax=maxsubarray(a,10);
        cout<<themax;
    }
  • 相关阅读:
    HDU-6801 2020HDU多校第三场T11 (生成函数)
    [HDU-6791] 2020HDU多校第三场T1(回文自动机)
    回文自动机 (PAM,Palindrome Automaton)
    字符串的Period(周期),Border
    「APIO2019」路灯 (K-D Tree / 树套树 / CDQ + 树状数组)
    「APIO2019」桥梁(询问分块+并查集)
    「APIO2019」奇怪装置
    「APIO2018」选圆圈(K-D Tree/CDQ+Set)
    堆小结
    【[HNOI/AHOI2018]毒瘤】
  • 原文地址:https://www.cnblogs.com/812969272zheng/p/3592910.html
Copyright © 2011-2022 走看看