分治算法一般分为3个步骤:
1.划分问题:把问题的实例划分为子问题
2.递归求解:递归解决子问题
3.合并问题:合并子问题的解得到原问题的解
最大连续和问题
#include<iostream>
using namespace std;
int maxsum(int* A, int x, int y){
int i, m, v, L, R, max;
if(y-x == 1) return A[x]; //只有一个元素,直接返回
m = x + (y-x) / 2; //分治第一步:划分成[x,m)和[m,y)
//分治第二步,递归求解
if(maxsum(A, x, m) > maxsum(A, m, y)){
max = maxsum(A, x, m);
}else{
max = maxsum(A, m, y);
}
//分治第三步:合并(1)----从分界点开始往左的最大连续和L
v = 0; L = A[m-1];
for(i = m-1; i >= x; i--){
v += A[i];
if(L < v){
L = v;
}
}
//分治第三步:合并(2)----从分界点开始往右的最大连续和R
v = 0; R = A[m];
for(i = m; i < y; i++){
v += A[i];
if(R < v){
R = v;
}
}
if(max > (L+R)){
return max;
}else{
return (L+R);
}
}