最大的子序列和的问题:

给定整数A1, A2, A3, A4, ----AN(可能有负数),求Sum = Ai + Ai+1+-----+Aj;求Sum最大值,若所有整数均为负数,则Sum= 0;

法1: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;
}

法2:O(N^2)

int MaxSubSequenceSum(const int A[], int N )
{
int ThisSum, MaxSum, i, j, k;
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;
}

  法3:O(NlgN)

int MaxSubSequenceSum(const int A[], int N )
{
   return MaxSubSum(A, 0, N - 1);
}

int MaxSubSum(const int A[ ], int Left, int Right)
{
   int MaxLeftSum, MaxRightSum;
   int MaxLeftBorderSum, MaxRightBorderSum;
   int LeftBorderSum, RightBorderSum;
   int center, i;

    if(Left == Right)
    {
       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 Max3(int a, int b, int c)
{
   if(a < b)
      a = b;
   if(a < c)
      a = c;
   return a;
}

  法4:O(N)

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

  

猜你喜欢

转载自www.cnblogs.com/hi3254014978/p/9446719.html