最大子列和分而治之的解法
//数据结构-最大子列和
/*思路分而治之
递归求左右的最大子列和,再考虑跨界分界线的特殊情况,最后比较左边最大,右边最大和左右跨界之和的最大值*/
int Max3{int A,int B,int C}
{/*返回3个整数的最大值*/
return A > B ? A > C ? A :C : B > C ? B : C ;
}
int DivideAndConquer (int List[],int left,int right){ //分治法秋List[left],list[right]的最大子列和
int MaxLeftSum,MaxRightSum; //存放左右子问题的解
int MaxLeftBorderSum,MaxRightBorderSum; //存放跨分界线的结果
int LeftBorderSum,RightBorderSum; //存放跨分界线的各种可能
int center,i; //分而治之,先找中心
if(left == right){ //递归的终止条件 之 子列只有1个数字
if(List[left]>0)
return List[left];
else return 0;
}
/*下面是“分”的过程,求分别求出左右最大子列和*/
center = ( left + right ) / 2; //找到center,中间点
MaxLeftSum = DivideAndConquer ( List,left,center); //递归求得两遍
MaxRightSum = DivideAndConquer ( List,center+1,right);
/*下面求跨分界线的最大子列和*/
MaxLeftBorderSum = 0; LeftBorderSum = 0;
for( i = center+1;i >= left;i-- ){//从中线向左扫描
LeftBorderSum += List[i];
if(LeftBorderSum > MaxLeftBorderSum)
MaxLeftBorderSum = LeftBorderSum;
} //左边扫描结束,方法是不停地用“新的跨分界线的子列和”和“已知最大跨界子列和比较”
MaxRightBorderSum = 0; RightBorderSum = 0;
for( i = center+1;i <= Right;i++ ){//从中线向右扫描
RightBorderSum += List[i];
if(LeftBorderSum > MaxRightBorderSum)
MaxRightBorderSum = RightBorderSum;
} //右边边扫描结束,方法是不停地用“新的跨分界线的子列和”和“已知最大跨界子列和比较”
/*返回“治”的结果*/
return Max3(MaxLeftSum,MaxRightSum,MaxLeftBorderSum+MaxRightSum);
}
int MaxSubseqSum3(int List[],int N ){ //保持和前面2种算法相同的函数接口
return DivideAndConquer( List,0,N-1);
}