数据结构第一个编程题:用分治法求最大子列(参考陈越《数据结构》)
代码如下:
#include<stdio.h>
/*
Name: get the maxsubsequence
Copyright:
Author: demosees
Date: 22/03/17 11:44
Description: (by devc++)
*/
int Max3(int A,int B,int C)//求三个数中的最大值
{
return A>B?A>C?A:C:B>C?B:C;
}
int DivideAndConquer(int List[],int left,int right)//分治策略
{
int MaxLeft,MaxRight;
int MaxLeftSum,MaxRightSum;
int LeftSum,RightSum;
int center,i;
if(left==right)//递归的终止条件
if(List[left]>0) return List[left];
else return 0;
center=(left+right)/2; //分
MaxLeft=DivideAndConquer(List,left,center);//求左边的最大值
MaxRight=DivideAndConquer(List,center+1,right);//求右边的最大值
MaxLeftSum=0;LeftSum=0;//从中间开始往两边求
for(i=center;i>=left;i--){
LeftSum=LeftSum+List[i];
if(LeftSum>MaxLeftSum) //从中间往左边扫描
MaxLeftSum=LeftSum;
}
MaxRightSum=0;RightSum=0;
for(i=center+1;i<=right;i++){
RightSum=RightSum+List[i];
if(RightSum>MaxRightSum) //从中间往右边扫描
MaxRightSum=RightSum;
}
return Max3(MaxLeft,MaxRight,MaxLeftSum+MaxRightSum);//将三个结果合在一起选取最大值
}
int MaxSubseqSum3(int List[],int N)//把借口转换过去
{
return DivideAndConquer(List,0,N-1);
}
int main()
{
int subsque[100000],n,j;//输入n个随机的数
scanf("%d",&n);/*首先输入数的个数*/
for(j=0;j<n;j++)
scanf("%d",&subsque[j]);
printf("%d",MaxSubseqSum3(subsque,n));
return 0;
}