//8 4 -3 5 -2 -1 2 6 -2
#include<stdio.h>
#include<stdlib.h>
int MaxSubsequenceSum_1(const int A[],int N);//三层循环o(n^3)
int MaxSubsequenceSum_2(const int A[],int N);//两层循环o(n^2)
static int MaxSubsequenceSum_3(const int A[],int left,int right);//分治o(nlog(n)
int MaxSubsequenceSum_4(const int A[],int N);//o(n) perfect
int Max3(int a,int b,int c);
int main(void)
{
int n,i;
scanf("%d",&n);
int* a;
a=(int *)malloc(n*sizeof(int));
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("The max is:%d",MaxSubsequenceSum_3(a,0,n-1));
}
int MaxSubsequenceSum_1(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;
}
int MaxSubsequenceSum_2(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;
}
static int MaxSubsequenceSum_3(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=MaxSubsequenceSum_3(A,left,center);
MaxRightSum=MaxSubsequenceSum_3(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;
}
int MaxSubsequenceSum_4(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;
}
“`