#include<iostream>
#include<windows.h>
#include<ctime>
#include<stdio.h>
using namespace std;
class MaxSubsequenceSum
{
public:
MaxSubsequenceSum(int *Array, int Left1, int Right1):A(Array), Left(Left1), Right(Right1)
{
outcome = 0;
}
int maxx(int a = 0, int b = 0, int c = 0)
{
int temp = a>b?a:b;
return (temp>c?temp:c);
}
int MaxSubsequenceSum1()
{
int ThisSum, MaxSum, i, j, k;
MaxSum = 0;
for (i = Left; i <= Right; i++)
{
for (j = i; j <= Right; j++)
{
ThisSum = 0;
for (k = i; k <= j; k++)
ThisSum += A[k];
if (ThisSum > MaxSum)
MaxSum = ThisSum;
}
}
return MaxSum;
}
int MaxSubsequenceSum2()
{
int ThisSum, MaxSum, i, j;
MaxSum = 0;
for (i = Left; i <= Right; i++)
{
ThisSum = 0;
for (j = i; j <= Right; j++)
{
ThisSum += A[j];
if (ThisSum > MaxSum)
MaxSum = ThisSum;
}
}
return MaxSum;
}
int MaxMub3(int A[], int Left, int Right, int middle)
{
int max1 = A[middle];
int count = 0;
for (int i=middle; i>=Left; i--)
{
count += A[i];
if (count > max1)
max1 = count;
}
int max2 = A[middle];
count = 0;
for (int i = middle; i<=Right; i++)
{
count += A[i];
if (count > max2)
max2 = count;
}
return (max1+max2-A[middle]);
}
int MaxSub3(int Array[], int Left1, int Right1)
{
int middle = int ((Left1+Right1)/2);
int subleft, subright, submiddle;
if (Left1==Right1)
return Array[Left1];
if (Left1==Right1-1)
return Array[Right1];
subleft = MaxSub3(Array, Left1, middle);
subright = MaxSub3(Array, middle, Right1);
submiddle = MaxMub3(Array, Left1, Right1, int((Left1+Right1)/2));
return maxx(subleft, subright, submiddle);
}
int MaxSubsequenceSum3()
{
return MaxSub3(A, Left, Right);
}
int MaxSubsequenceSum4()
{
int ThisSum, MaxSum, j;
ThisSum = MaxSum = 0;
for (j = Left; j<=Right; j++)
{
ThisSum += A[j];
if (ThisSum > MaxSum)
MaxSum = ThisSum;
else if(ThisSum < 0)
ThisSum = 0;
}
return MaxSum;
}
int MaxSubsuquenceSum(int x)
{
switch(x)
{
case 1:
{
outcome = MaxSubsequenceSum1();
printf("Algorithm 1\nOutcome: %d\nTime Complexity: O(n^3)\n", outcome);
break;
}
case 2:
{
outcome = MaxSubsequenceSum2();
printf("Algorithm 2\nOutcome: %d\nTime Complexity: O(n^2)\n", outcome);
break;
}
case 3:
{
outcome = MaxSubsequenceSum3();
printf("Algorithm 3\nOutcome: %d\nTime Complexity: O(n*logn)\n", outcome);
break;
}
case 4:
{
outcome = MaxSubsequenceSum4();
printf("Algorithm 4\nOutcome: %d\nTime Complexity: O(n)\n", outcome);
break;
}
default:
{
cout<<"Input Error!"<<endl;
return -1;
}
}
}
private:
int *A;
int Left;
int Right;
int outcome;
};
void main()
{
time_t start,end,time;
const int N = 30;
int Array[30] = {-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,2,3,4,5,6,7,-1,-1,-1,-1,-111,-1,-1};
start=clock();
MaxSubsequenceSum a(Array, 0, N-1);
a.MaxSubsuquenceSum(1);
end=clock();
time=end-start;
long ti = time;
printf("Running time:%d ms\n\n", ti);
}