一、分治法思想:
1.原问题能分解成若干个小的问题,小的问题之间相互独立,且问题的类型相同。
2.子问题足够小的时候可以直接求解。
3.子问题的解能够合成原问题的解
- 因此多为递归问题。
二、应用
1.求最大最小元
- 求一组序列的最大最小元,能把长的序列分成两段短的序列。分别求出两段序列的最大值和最小值,再进行比较后合成整个序列的最大值和最小值。
- 极限就是分到最后序列就剩一个元素或者两个元素了,就可以直接得出最大值和最小值再向上合并。
#include <bits/stdc++.h>
using namespace std;
int L[100];
int n;
int MAX(int a,int b){
return a>b?a:b;}
int MIN(int a,int b){
return a>b?b:a;}
//函数无法返回两个值就在一起就行打包了
typedef struct
{
int max;
int min;
}T;
//关键代码
T MAXMIN(int i,int j)
{
if(i==j)//序列只剩下一个元素
{
T t;
t.max=t.min=L[i];
return t;
}
else if(i+1==j)//序列剩下两个元素
{
T t;
t.max=MAX(L[i],L[j]);
t.min=MIN(L[i],L[j]);
return t;
}
else//序列长度大于2继续分割序列
{
T t;
//递归方程
t.max=MAX(MAXMIN(i,(i+j)/2).max,MAXMIN((i+j)/2+1,j).max );
t