首页 > 其他 > 详细

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

时间:2014-03-11 00:13:38      阅读:414      评论:0      收藏:0      [点我收藏+]

郑云飞--韩亚华 

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

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

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

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

bubuko.com,布布扣
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;

}
bubuko.com,布布扣

测试函数

bubuko.com,布布扣
int main()
{
    int a[10]={2,4,6,-2,-78,9,8,-1,9,-3};
    int themax;
    themax=maxsubarray(a,10);
    cout<<themax;
}
bubuko.com,布布扣

求整数数组中和最大的子数组的和,布布扣,bubuko.com

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

原文:http://www.cnblogs.com/hanyahua/p/3592617.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!