基础算法在(枚举、贪心、分治策略)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

佳佳的家在车站1,他有五个亲戚,分别 住在车站a,b,c,d,e。过年了,他需要从 自己的家出发,拜访每个亲戚(顺序任 意),给他们送去节日的祝福。怎样走, 才需要最少的时间?
分析
这一题中的边数远小于n2,所以复杂度也 只有nlwenku.baidu.comgn+m
算法框架是: (1)用5次最短路,计算出6个点两两之
间的距离 (2)枚举5个结点的全排列,找到一个使
枚举法常用于解决“是否存在”或“有 多少种可能”等类型的问题。例如,求 解不定方程的问题就可以采用列举法。
虽然枚举法本质上属于搜索策略,但是它与回溯法有所不同。因为适用 枚举法求解的问题必须满足两个条件:
⑴可预先确定每个状态的元素个数n;
⑵状态元素a1,a2,…,an的可能值为一个连续的值域。 设
If dis[knight[kk].x,knight[kk].y,x,y]<min then begin
Min:= dis[knight[kk].x,knight[kk].y,x,y];
Mink:=k;
End; End; Now:= all-mink武士走到汇合点的距离+ mink武士走到汇聚 点的距离+ 国王走到汇聚点的距离+从汇聚点到汇合点的距离; Best:=min(best,now) End;
枚举方法的优化
枚举算法的时间复杂度:状态总数*单个状态的耗时 主要优化方法:
⑴ 减少状态总数 ⑵ 降低单个状态的考察代价 优化过程从以下几个方面考虑: ⑴ 枚举对象的选取 ⑵ 枚举方法的确定 ⑶ 采用局部枚举或引进其他算法
枚举算法的应用
例题1:二进制数的分类
若将一个正整数转化为二进制数后,0的个数多于 1的个数的这类数称为A类数,否则称为B类数。 例如:
得总路程长度最短的方案。
最大子矩阵的求解方法
第二部分
贪心方法
贪心方法的基本思想
贪心是一种解题策略,也是一种解题思想 使用贪心方法需要注意局部最优与全局最优的
关系,选择当前状态的局部最优并不一定能推 导出问题的全局最优 利用贪心策略解题,需要解决两个问题: 该题是否适合于用贪心策略求解 如何选择贪心标准,以得到问题的最优解
局部枚举
例题5:求第一、第二、第三最短路问题
局部枚举
例题6:新年好 重庆城里有n个车站,m条双向公路连接其 中的某些车站。每两个车站最多用一条公路 直接相连,从任何一个车站出发都可以经过 一条或多条公路到达其他车站,但不同的路 径需要花费的时间可能不同。在一条路上花 费的时间等于路径上所有公路需要的时间之 和。
(13)10=(1101)2, 13为B类数;
(10)10=(1010)2
10为B类数;
(24)10=(11000)2 24为A类数;
程序要求:求出1~1000之中(包括1与1000), 全部A、B两类数的个数。
枚举算法的应用
【分析】此题是一道统计类题目。解决
统计问题的一个常用方法是枚举法:逐一 枚举所有情况,同时进行统计,枚举结束 时,统计也完成,得到结果。
具体对本题而言,采用枚举法的正确性与 可行性是显然的,而本题的数据规模又仅 为1~1000,所以采用逐一枚举方法进行 统计的时间复杂度是完全可以接受的。
例题2:01统计
枚举算法的应用
例题4:圆桌骑士(IOI试题) 在一个8*8的棋盘上,有一个国王和若干 个武士。其中,国王走一字步,骑士走 马步。若国王与骑士相会在同一点上, 国王可以选择让骑士背他走。求一个点, 使所有的骑士和国王相距在这个点上的 所走的步数最少。
枚举算法的应用
国王最多只会与一个骑士结合,因为骑士的最终 目标也是最终汇聚点,一旦国王与某个骑士汇合 后,即马上可与其结合,剩下的只需要将所有的 骑士汇合就可以了。更没有必要在中途中有将国 王托付给其他的骑士。 这样我们估算一下时间 为O(8*8*8*8*63)=O(36*10^4),完全可 以承受。
枚举策略的基本思想
枚举法,又称穷举法,指在一个有 穷的可能的解的集合中,一一枚举 出集合中的每一个元素,用题目给 定的检验条件来判断该元素是否符 合条件,若满足条件,则该元素即 为问题的一个解;否则,该元素就 不是该问题的解。
枚举策略的基本思想
枚举方法也是一种搜索算法,即对问题 的所有可能解的状态集合进行一次扫描 或遍历。在具体的程序实现过程中,可 以通过循环和条件判断语句来完成。
枚举算法的应用
【分析】此题可从3个方面考虑: 分治、枚举、数学方法。
由于无法将这个问题划分为各自独立的小问题来 解决,分治显然是不行的。又因武士和国王位置 的不固定性和其走法的差异,推导不出一个数学 公式。因此考虑使用枚举,需要枚举的三个要点: 1、最后的汇聚点。 2、国王与背他的骑士的汇聚点。 3、国王与背他的骑士。
另外,我们需要预先将2点之间走马字步的距离 计算出来。可以使用Floyd或是Bfs。
算法流程:
dis[x1,y1,x2,y2]--(x1,y1)(x2,y2)之间的距离。 For I:=1 to 8 do{枚举汇合点}
For j:=1 to 8 do begin All :=所有骑士到这一点的和; Best:=min(best,all+国王到汇聚点的步数) For x:=1 to 8 do {枚举武士国王的相会点} For y:=1 to 8 do begin For kk:=1 to k do {枚举与国王结合的武士}
for ai←ai1 to aik do
……………………
for an←an1 to ank do if 状态(a1,…,ai,…,an)满足检验条件
then 输出问题的解;
枚举策略的基本思想
枚举法的特点是算法比较简单,在用枚 举法设计算法时,重点注意优化,减少 运算工作量。将与问题有关的知识条理 化、完备化、系统化,从中找出规律, 减少枚举量。
ai1— 状 态 元 素 ai 的 最 小 值 ; aik— 状 态 元 素 ai 的 最 大 值 (1≤i≤n) , 即 a11≤a1≤a1k,a21≤a2≤a2k, ai1≤ai≤aik,……,an1≤an≤ank
for a1←a11 to a1k do
fo a2←a21 to a2k do ……………………
相关文档
最新文档