NOIP基础算法——贪心和分治讲稿.ppt

NOIP基础算法——分治与贪心 第五部分 分治策略 一、分治思想 分治法,又叫分治策略,顾名思义,分而治之。 它的基本思想:对于难以直接解决的规模较大的问题,把它分解成若干个能直接解决的相互独立的子问题,递归求出各子问题的解,再合并子问题的解,得到原问题的解。 通过减少问题的规模,逐步求解,能够明显降低解决问题的复杂度。 二、分治法的适用条件 能使用分治法解决的问题,它们一般具备以下几个特征: ①该问题可分解成若干相互独立、规模较小的相同子问题; ②子问题缩小到一定的程度就能轻易得到解; ③子问题的解合并后,能得到原问题的解; 分治法在信息学竞赛中应用非常广泛,使用分治策略能生成一些常用的算法和数据结构,如快排、最优二叉树、线段树等;还可以直接使用分治策略,解决一些规模很大、无法直接下手的问题。 三、分治的三步骤 ①分解:将要解决的问题分解成若干个规模较小的同类子问题; ②解决:当子问题划分得足够小时,求解出子问题的解。 ③合并:将子问题的解逐层合并成原问题的解。 分治算法设计过程图 在划分问题时,可以采用递归策略,把一个大问题逐步分解成规模较小的子问题,直至可以直接求出子问题的解;再将子问题逐层合并,返回到顶层,得到原问题的解。 根据分治策略的划分原则,把原问题划分成多少个子问题才合适呢?各个子问题的规模应该多大才合适呢? 一般来说,每次划分成2个子问题,每个子问题的规模差不多最合适。合并解时要因题而异,有些问题递归分解完能直接得到原问题的解,有些问题需逐层合并,得到原问题的解。 四、分治的框架结构 procedure Divide() begin if(问题不可分)then//解决 begin 直接求解; 返回问题的解; end else begin 对原问题进行分治;//分解 递归对每一个分治的部分进行求解; //解决 归并整个问题,得出全问题的解; //合并 end end; 五、分治的典型应用 1、求最大值和最小值 2、求方程的根 3、二分查找 4、归并排序 5、快速幂 6、求解线性递推关系 7、棋盘覆盖问题 8、循环日程表问题 9、寻找最近点对 1、求最大值和最小值 例题1:给n个数,求它们之中最大值和最小值,要求比较次数尽量小。 分析:假设数据个数为n,存放在数组a[1..n]中。可以直接进行比较: minn:=a[1];maxx:=a[1]; for i:=2 to n do if a[i]maxx then maxx:=a[i]; else if a[i]minn then minn:=a[i]; 使用这一算法,比较次数为2(n-1)。若n=10,则比较18次。 【方法2】分治策略 划分:把n个数均分为两半。即:划分点为d=(r1+r2)/2,两个区间为[r1,d]和[d+1,r2]。 递归求解:求左半的最小值min1 和最大值max1以及右半最小值min2和最大值max2。 合并:max1与max2比较得到所有数的最大值为maxx; min1与min2比较得到所有数的最小值为minn。 procedure pd(r1,r2:integer;var maxx,minn:integer) begin var max1,min1,max2,min2,d:integer; if r1=r2 then begin maxx:=x[r1]; minn:=x[r1];end else if r2=r1+1 then begin if x[r2]x[r1] then begin maxx:=x[r2];minn:=x[r1];end else begin maxx:=x[r1];minn:=x[r2];end end else begin d:=(r1+r2)/2; pd(r1,d,max1,min1);

文档评论(0)

1亿VIP精品文档

相关文档