问题:给定整数A1、A2,…,An(可能有负数),求Ai~Aj之和的最大值。
其中四种算法,每种运行时间不同
#include <stdio.h>
//算法一,运行时间为O(N3)
int MaxSubsequenceSum(const int A[], int N)
{
int ThisSum, MaxSum = 0, i, j, k;
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;
}
//算法二,运行时间为(N2)
int MaxSubSequenceSum(const int A[], int N)
{
int ThisSum, MaxSum = 0, i, j;
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(Nlog(N))
int Max3(a, b, c)
{
if(a > b)
if(a > c)
return a;
else
return c;
else
if(b > c)
return b;
else
return c;
}
static int MaxSubSum(const int A[], int Left, int Right)
{
int MaxLeftSum, MaxRightSum;
int MaxLeftBorderSum = 0, MaxRightBorderSum = 0;
int LeftBorderSum = 0, RightBorderSum = 0;
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);
for(i = Center;i >= Left;i--)
{
LeftBorderSum += A[i];
if(LeftBorderSum > MaxLeftBorderSum)
MaxLeftBorderSum = LeftBorderSum;
}
for(i = Center + 1;i <= Right;i++)
{
RightBorderSum += A[i];
if(RightBorderSum > MaxRightBorderSum)
MaxRightBorderSum = RightBorderSum;
}
return Max3(MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum);
}
//算法四,运行时间为O(N)
int MaxSubSequence(const int A[], int N)
{
int ThisSum = 0, MaxSum = 0, j;
for(j = 0;j < N;j++)
{
ThisSum += A[j];
if(ThisSum > MaxSum)
MaxSum = ThisSum;
else if(ThisSum < 0)
ThisSum = 0;
}
return MaxSum;
}
int main()
{
int N, A[100], i;
scanf("%d", &N);
for(i = 0;i < N;i++)
scanf("%d", &A[i]);
int Max;
Max = MaxSubsequenceSum(A, N);//随便调取一个
printf("%d", Max);
retunr 0;
}