分治法解决最大子段和

#include
#include
#include
#include
#include
#include
using namespace std;
//二分法不独立情况:分治法解决最大子段和
//利用二分分治的思想 对于
//如果将所给的序列a[1:n]分为长度相等的两段a[1:n/2]和a[n/2+1:n],分别求出这两段的最大子段和,则a[1:n]的最大子段和有三种情况:
//(1) a[1:n]的最大子段和与a[1:n/2]的最大子段和相同
//(2) a[1:n]的最大子段和与a[n/2+1:n]的最大子段和相同
//(3) a[1:n]的最大子段和为a[i]+…+a[j],并且1<=i<=n/2,n/2+1<=j<=n
int maxsum(int *a,int left,int right)
{
int mid=(left+right)/2;
if(left==right) return a[left]>0?a[left]:0;//递归的终点 这个数要么选要么不选 0为不选,正的时候就选上它
else
{
int leftsum=maxsum(a,left,mid);
int rightsum=maxsum(a,mid+1,right);
//对第三种情况的讨论 建立两个指针然后从中间往两边找中间能连上的maxsum和左右maxsum相比
int sum1=0,sum2=0;
int max1=0,max2=0;
for(int i=mid;i>=left;i–)//获得第三种情况左边最大
{
sum1+=a[i];
if(sum1>max1)
max1=sum1;
}
for(int i=mid+1;i<=right;i++)//获得第三种情况右边最大
{
sum2+=a[i];
if(sum2>max2)
max2=sum2;
}
int sum=max1+max2;
return max(max(leftsum,rightsum),sum);
}
}
int a[10]={1,-1,2,2,3,-3,4,-4,5,-5};
int main()
{
cout< return 0;
}

你可能感兴趣的:(算法设计与分析上课)