分治法
1、将问题"分割"成局部问题;
2、递归求局部问题
3、将局部问题的解"整合",解决原问题
//分治法找最大元素模板题(最小)
#include <bits/stdc++.h>
using namespace std;
/*大白2书上p110有问题:
int fmax(int a[],int l,int r){
int mid=(l+r)/2;
if(l==r-1)return a[l];
int u=fmax(a,l,mid);
int v=fmax(a,mid,r);
int x=max(u,v);
return x;
}*/ /*案例:1 2 3 4 5 输出:4 */
int fmax(int a[],int l,int r){
int mid=(l+r)/2;
if(l==r||l==r-1)return max(a[l],a[r]);
return max(fmax(a,l,mid),fmax(a,mid+1,r));
/*优化以下代码如上
int u=fmax(a,l,mid);
int v=fmax(a,mid+1,r);
int x=max(u,v);
return x;*/
}/*案例:1 2 3 4 5 输出:5*/
int main(){
int a[5];
for(int i=0;i<5;i++)cin>>a[i];
cout<<fmax(a,0,4);
return 0;
}
/*推算过程 案例:1 2 3 4 5
f(a,0,4)-> m=2;u=f(a,0,2);v=f(a,3,4)=max(a[3],a[4])=5;x=max(u,v);return x;
f(a,0,2)-> m=1;u=f(a,0,1)=a[1]=2;v=f(a,2,2)=a[2]=3;x=3;return 3;
故:总return 5;
*/