采用分治法求最大子列
数据结构第一个编程题:用分治法求最大子列(参考陈越《数据结构》)
代码如下:
#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; }
生命之树常青葱,而理论总朦胧!