如果将所给的序列a[1:n]分为长度相等的两段a[1:n/2]和a[n/2:n],分别求出这两段的最大子段和,则a[1:n]的最大子段和有三种情形:(当所有整数均为负数时定义其最大子段和为0)
1)a[1:n]的最大子段和与a[1:n/2]的最大子段和相同;
2)a[1:n]的最大子段和与a[n/2:n]的最大子段和相同;
3)a[1:n]的最大子段和为Σ(k=i~j)ak,且1<=i<=n/2,n/2+1<=j<=n;
(1)(2)可递归求得。对于(3),容易看出a[n/2]与a[n/2+1]在最优子序列中。据此可以设计出分治算法如下:
#include<iostream>
using namespace std;
int MaxSubSum(int *a,int left,int right)
{
int i,leftsum,rightsum,lefts,rights,center,s1,s2;
int sum=0;
if