zoukankan      html  css  js  c++  java
  • 最大子序列和问题的四种算法

    算法一,该算法的复杂度为:O(N^3)

    int MaxSubsequenceSum( const int A[],int N)
    {
    	int ThisSum,Maxsum,i,j,k;
        MaxSum = 0;
        for(i = 0; i < N; i++)
        	for(j = i; j < N; j++)
            {
            	ThisSum = 0;
                for(k = i; k <= j; k++)
                	ThisSum += A[k];
                if(ThisSum > MaxSum)
                	MaxSum = ThisSum;
            }
        return MaxSum;
    }
    

    算法二,该算法的复杂度为:O(N^2)

    int MaxSubsequenceSum( const int A[],int N)
    {
    	int ThisSum,MaxSum,i,j;
        MaxSum = 0;
        for( i = 0; i < N; i++)
        {
        	ThisSum = 0;
            for(j = i; j < N;j++)
            {
            	ThisSum += A[j];
                if(ThisSum > MaxSum)
                	MaxSum = ThisSum;
            }
        }
        return MaxSum;
    }
    

    算法三,该算法的复杂度为:O(NlogN)

    static int MaxSubSum(const int A[],int Left,int Right)
    {
    	int MaxLeftSum,MaxRightSum;
        int MaxLeftBorderSum,MaxRightBorderSum;
        int LeftBorderSum,RightBorderSum;
        int Center,i;
        
        if (Left == Right) /* Base Case */
        	if (A[Left] > 0)
            	return A[Left];
            else
            	return 0;
        Center = (Left + Right)/2;
        MaxLeftSum = MaxSubSum(A,Left,Center);
        MaxRightSum = MaxSubSum(A,Center+1,Right);
       
        MaxLeftBorderSum = 0;
        LeftBorderSum = 0;
        for(i = Center; i >= Left; i--)
        {
       	   LeftBorderSum += A[i];
              if(LeftBorderSum > MaxLeftBorderSum)
            	MaxLeftBorderSum = LeftBorderSum;
        }
       
        MaxRightBorderSum = 0;
        RightBorderSum = 0;
        for(i = Center + 1; i <= Right; i++)
        {
       	  RightBorderSum += A[i];
             if(RightBorderSum > MaxRightBorderSum)
            	MaxRightBorderSum = RightBorderSum;
       }
       
       return Max3(MaxLeftSum,MaxRightSum,MaxLeftBorderSum + MaxRightBorderSum);
    }
    int MaxSubsequenceSum(const int A[],int N)
    {
    	return MaxSubSum(A,0,N-1);
    }
    

    算法四,该算法的复杂度为:O(N)

    int MaxSubsequenceSum(const int A[],int N)
    {
    	int ThisSum,MaxSum,j;
        ThisSum = MaxSum = 0;
        for(j =0; j < N; j++)
        {
        	ThisSum += A[j];
            if(ThisSum > MaxSum)
            	MaxSum = ThisSum;
            else if(ThisSum < 0)
            	ThisSum = 0;
        }
        return MaxSum;
    }
  • 相关阅读:
    log4net preserveLogFileNameExtension 和 watch
    BootStrap自带的图标
    git fetch批处理,遍历一个文件夹下的所有子目录,执行git fetch --all
    Recommended Settings for Tracing and Message Logging
    蜗牛—JSONJ学习ava转变
    Do you master on array in C ?
    全面推行使用智能指针的权利
    2014/08/23——OJ出现waiting...
    在Windows通过使用MinGW静态编译Assimp
    Ubuntu12.04password正确 入口的桌面(测试的恢复正常)
  • 原文地址:https://www.cnblogs.com/y3w3l/p/6349365.html
Copyright © 2011-2022 走看看