分治策略
分治策略在每层递归中主要运用到下面三个步骤:
- 分解步骤将问题划分成一些子问题,子问题的形式与原问题一样,只是规模更小。
- 解决步骤递归地求解出子问题,如果子问题足够小,则停止递归,直接求解。
- 合并步骤将子问题的解合成原问题的解
1.求最大子数组问题
问题描述:即在数组中选择一个区间,使得这个区间元素的和最大(当然如果数组的元素全是正数或全是负数,那么这个问题没有任何的意义)
思路解析:利用分治的思想,把数组不断地划分成子数组,直到不能再划分了为止;首先分析一下,最大子数组的位置只可能是以下三种情况:
- 中点的左边
- 跨中点
- 中点的右边
基于这三种情况对原问题进行递归求解
源码
#include<iostream>
using namespace std;
//此结构体主要用来存放局部最大子数组的左索引,右索引以及和
struct MaxSubarray {
int max_left;
int max_right;
int max_s