[较好的深搜教学资料]搜索与回溯.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[较好的深搜教学资料]搜索与回溯.ppt

一个最简单的想法: 我们可以从左上角到右下角枚举每一个未填上的格子,再枚举它可以放哪些数字,将它填上后继续搜索。当所有格子都填上后,计算一下总分,如果总分大于当前最优值就更新最优值 这样大约可以得35分 我们还可以对上面的想法进行改进: 我们可以先计算出每个格子的选择数 先确定可选择数小的格子 即先把只有一种选择的格子确定下来 再确定有两种选择的格子 …… 从而避免搜索到过多无法得到可行方案的状态 这样大约可以得75分 对于这道题,由于数据的原因,如果从右下角到左上角枚举,可以得到90分左右。 如果再加上一个叫做卡步的东西,我们可以得到100分。 什么是卡步? 我们发现搜到一个可行的方案是很快的,时间主要用于更新最优解。卡步就是当执行的步数到达一定值时,若程序还没有结束,那么我们就直接输出搜到的最优解,并退出。这个值很有可能不是最优的,但若继续搜索下去必然会超时,所以我们直接退出。这是在比赛中常用的技巧。 如何卡步? 最简单的办法就是在过程dfs中加入 inc(p);if p… then begin writeln(ans);halt; end; 本题可以用搜索+卡步得到100分,很重要的原因是这道题测试数据的特殊性。 如果要使程序能通过任何数据,可以采用位运算加速搜索和Dancing-links,但这两种方法在联赛范围内基本不会出现,我们不进行深入讨论。 另外还用一种方法可以得到100分:根据当前状态确定每个格子的选择数 搜索与回溯 给定n(n≤10),求1,2,3,…,n的全排列个数。 如果一个数列包含这n个数,并且这n个数都仅出现一次,符合该条件的所有数列叫做这n个数的全排列。 如1,2,3三个元素的全排列为: 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 看一个简单的问题 什么是全排列? 可能有的同学已经注意到了 这个问题的答案就是n!=1×2×3×……×n 如果要输出所有方案呢? 先确定放在第1个位置的是哪个数 当n个位置的数都确定下来后,我们就得到了一个方案 依次确定第2个位置,第3个位置,……,第n个位置 我们可以用一个布尔数组used来表示每个数字是否用过,用过为true,未用过为false。用ans[i]记录第i个位置的数是多少 for i:=1 to n do if not used[i] then //若i未出现过则在 第k个位置放i begin ans[k]:=i; used[i]:=true; //标记 dfs(k+1);//继续搜索 used[i]:=false;//回溯 end; end; begin read(n); dfs(1); end. program quanpailie; var n:longint; ans:array [0..10] of longint; used:array [0..10] of boolean; procedure dfs(k:longint); var i:longint; begin if kn then begin for i:=1 to n-1 do write(ans[i], ); writeln(ans[n]); exit; end; Procedure search(k:integer); begin if 到目的地 then 输出解 ; exit; for I:=1 to 算符种数 do begin 保存结果 search(k+1); 恢复到保存结果之前的状态 end; end; 深度优先搜索的一般框架: Procedure dfs(k,……); var …… begin if 已找到一种方案 then begin print; exit; end; 枚举每种选择 if 该选择可行 then

文档评论(0)

youngyu0329 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档