/*
Copyright personal all reversed
Author Steven
Date 2011-06-28
description:
input :
number array(positive and negative) in any sequence.
output
the sum of the longest subArray which the sequence must be continue .
Algorithm description:
use the thought of the recursion(准确说是分治). The longest sequence must in only left part or in right side
or both side.
if we use non-algorithm. we may enum all the possibilities. Enum the start point and the end point Cn2 = n*(n-1) +n
Calculate the result need n. we need O(n3)
分治每次可以二分,复杂度降低到logn 计算复杂度还是N 故总体复杂度n*logn
*/
#include <stdio.h>
#include <stdlib.h>
//[a,b)
int RecursionSum(int* pArray,int start,int end)
{
int sum = 0;
if(end - start == 1) // single point can return directly
return pArray[start];
int middleNum = (end + start)/2; // calculate the middle point
int left = RecursionSum(pArray, start, middleNum) ; // longest subArray in left part
int right = RecursionSum(pArray, middleNum, end);
if(left > right)
sum = left;
else
sum = right;
int leftSum = pArray[middleNum-1];
int tempSum = 0;
//================ longest subArray is both in left part and right part==========================//
//left side
for(int index = middleNum-1; index >= start; index--)
{
tempSum = tempSum + pArray[index];
if(leftSum <= tempSum)
{
leftSum = tempSum;
}
}
int righttSum = pArray[middleNum];
tempSum = 0;
// right side
for(index = middleNum; index < end;index++)
{
tempSum = tempSum + pArray[index];
if(righttSum <= tempSum)
{
righttSum = tempSum;
}
}
int LrSum = leftSum + righttSum;
if(LrSum > sum)
{
return LrSum;
}
else
return sum;
}
int main()
{
int nArray[11]={0,1,2,3,-100,5,6,7,8,9};
int sum = RecursionSum(nArray,0,10);
printf("%d",sum);
system("pause");
return 0;
}