1.什么是分治?
所谓分治,运用拆词法,就是分而治之
就是将一个复杂的大问题分成 几个规模较小 且 可以用同样方法处理 且 可以通过对小问题的求解得到大问题答案 的若干小问题
然后通过解决 容易解决的小问题得到大问题答案
上面是分治的思想
可能有点云里雾里,其实这个分治有二分的思想:
二分:通过把有序区间平分更快找到答案
分治:通过把区间分成多份让题面更简单
因为把题目分成2^n个小问题的分治比较常见
所以人们定义二分法:把问题分解成两个较小问题求解的分治
注意二分是一种思想,二分法是对于这种思想的运用
————
好吧我承认我有点偏题,对于分治还没有特别理解的看例子:
快速排序(当然归并也是)
其实快排就是二分法的体现
快速排序的主要思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的数据都比另外一部分的数据要小,然后再按此方法对这两部分分别进行快排。
(这里确实讲得不是很清楚,主要是czc已经全讲了)
2.分治如何解决问题?
(1)分解,将要解决的问题划分成若干规模较小的同类问题;
(2)求解,当子问题划分得足够小时,用较简单的方法解决;
(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。
3.如何实现分治?
(1)递归
(2)结构不复杂的可以用循环
4.什么时候可以用分治
(1)这个问题小到一定程度的时候很容易解决
(2)解决此问题的方法应该是通用的
(3)这个问题的解决应是最优解
(4)这个问题的解可以合并
(5)这些若干问题彼此不相关
老规矩,来几道例题,你基本上就懂了:
图片没有传完,不过问题不大,就剩下几组数据而已(铺地毯)。
分治代码:
下面展示一些 内联代码片
。
#include<cstdio>
int f2(int a)
{
int ans=1;
for(int i=1;i<=a;i++)
{
ans=ans*2;
}
return ans;
}
int findx(int m,int x)
{
if(x<=m)
return m+1;
return m;
}
int findy(int m,int y)
{
if(y<=m)
return m+1;
return m;
}
int pd(int mx,int my,int x,int y)
{
if(x<=mx&&y<=my)
{
return 3;
}
if(x<=mx&&y>my)
{
return 1;
}
if(x>mx&&y>my)
{
return 4;
}
return 2;
}
int sum=0;
void fz(int xmin,int xmax,int ymin,int ymax,int x,int y)
{
//xmin,与ymin是真正的左上角-1
sum++;
if(xmax-xmin<=1)return;
// printf("%d %d %d %d %d %d\n",xmin,xmax,ymin,ymax,x,y);
int mx=(xmin+xmax)/2;
int my=(ymin+ymax)/2;
//mx,my是左上方块的右下角
int xi=findx(mx,x);
int yi=findy(my,y);
int p=pd(mx,my,x,y);
printf("%d %d %d\n",xi,yi,p);
if