/*
* max.c
*
* Created on: Feb 4, 2016
* Author: wing
*/
/*
* test.c
*
* Created on: 2016年1月21日
* Author: wing
*/
#include<stdio.h>
#include<stdlib.h>
int smax(int *num,int l,int r,int *maxi,int *maxj)
{
int maxl=0,maxr=0,i,j,m=(l+r)/2,tmp;
tmp=0;
for (j=m;j<=r;j++)
{
tmp+=num[j];
if (maxr<tmp)
{
maxr=tmp;
*maxj=j;
}
}
tmp=0;
for (i=m;i>=l;i--)
{
tmp+=num[i];
if (maxl<tmp)
{
maxl=tmp;
*maxi=i;
}
}
return maxl+maxr-num[m];
}
int max(int a,int b)
{
return a>b?a:b;
}
int find(int *num,int l,int r)
{
int *maxi,*maxj,maxl,maxr,maxm;
if (l==r)
return num[l];
maxi=(int *)malloc(sizeof(int));
maxj=(int *)malloc(sizeof(int));
maxl=find(num,l,(l+r)/2);
maxr=find(num,(l+r)/2+1,r);
maxm=smax(num,l,r,maxi,maxj);
return max(max(maxl,maxr),maxm);
}
int main(void)
{
int *num,i,n;
scanf("%d",&n);
num=(int *)malloc(sizeof(int)*n);
for (i=0;i<n;i++)
scanf("%d",&num[i]);
printf("%d",find(num,0,n-1));
return 0;
}
不考虑输入数据的话复杂度是o(lgn)
该算法的思路是分治,最大的差要么在左边,要么在右边,要么是右边的最大值与左边的最小值之差,只是从递归下层要传到上层的东西多一些而已