求整数数组中和最大的子数组的和

郑云飞--韩亚华 

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

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

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

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

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;
}
原文地址:https://www.cnblogs.com/812969272zheng/p/3592910.html