问题描述
给定一个整数列,在其中找到最大的子序列和
问题分析
算法1:分治
用分治的思想,先将数列分为两部分,最大的子序列可能出现的情况分为三种:
- 左半部分
- 右半部分
- 横跨左右两半部分
最大子序列和就是这三种情况中的最大值
对于前两种情况,不断对其再划分,直到其长度为1,即临界状态,此时一个数的数列的最大子序列和就是其本身
对于第三种情况,则是左半部分(包括了左半部分最后一个元素)的最大和,加上右半部分(包括右半部分第一个元素)的最大和
最后求出三者的最大值
实现代码如下:
int f(const int a[],int left,int right){
if(left==right){
return a[left];
}
int mid=(left+right)/2;
int maxLeft=f(a,left,mid);
int maxRight=f(a,mid+1,right);
int maxBorderLeft=0,tmpLeft=0;
for(int i=mid;i>=left;i--){
tmpLeft+=a[i];
if(tmpLeft>maxBorderLeft) maxBorderLeft=tmpLeft;
}
int maxBorderRight=0,tmpRight=0;
for(int i=mid+1;i<=right;i++){
tmpRight+=a[i];
if(tmpRight>maxBorderRight) maxBorderRight=tmpRight;
}
int maxBorder=maxBorderLeft+maxBorderRight;
return myMax(maxLeft,maxRight,maxBorder);
}
int myMax(int a,int b,int c){
int tmp=a>b?a:b;
return tmp>c?tmp:c;
}