- 1、本文档共44页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
基础算法策略_枚举
基础算法策略;枚举策略;枚举策略的基本思想 ;枚举策略;设某个问题的解所涉及的参数(状态参数)有n个,分别表示为a1, a2,…, an,其中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 ……………………
for ai←ai1 to aik do ……………………
for an←an1 to ank do
if 状态(a1,…,ai,…,an)满足检验条件
then 输出问题的解;
;枚举策略;枚举策略的优化;枚举算法的应用;【分析】此题是一道统计类题目。解决统计问题的一个常用方法是枚举法:逐一枚举所有情况,同时进行统计,枚举结束时,统计也完成,得到结果。
具体对本题而言,采用枚举法的正确性与可行性是显然的,而本题的数据规模又仅为1~1000,所以采用逐一枚举方法进行统计的时间复杂度是完全可以接受的。;例题2:01统计;分析;设m=(112)10=(1110000)2,求1~m的A类数个数。可以将112个数分为以下几类:;数字形式为(10xxxxx)2
设5个填数位置填0的个数为S0,填1的个数为S1,则S0 + S1 = 5;
若为A类数,则S0 + 1 S1 + 1,可以取S0 = 5 S1 = 0;S0 = 4 S1 = 1;S0 = 3 S1 = 2.这一类数中的A类数个数: (55) + (45) + (35) ;数字形式为(0xxxxxx)2
这一类数字的分析与前几类略有不同,因为前几类二进制数的位数都是7,而这一类数还需对位数进行讨论:
(1)1位数,即(1)2,不是A类数
(2)2位数,即(1x)2,(10)2和(11)2都不是A类数
(3)3位数,即(1xx)2,A类数个数为(22) =1
(4)4位数,即(1xxx)2,A类数个数为(33) =1
(5)5位数,即(1xxxx)2,A类数个数为 (44)+ (34)=5
(6)6位数,即(1xxxxx)2,A类数个数为 (55) + (45) =6
最后的答案是1 + 5 + 16 + (1 + 1 + 5 + 6) = 35;对于一般情况:;1;要对从第2~n位上的每一个1进行上述统计,即第一类的最终结果应为:;第二大类:;第二大类:;根据二进制数的前缀来分类是合理的,既没有重复也没有遗漏。当m的二进制数长度为n时,最多有2n种类型,即 种,比直接穷举m个数有了很大进步。
;枚举对象的确定;此题可从3个方面考虑:分治、枚举、数学方法。
由于无法将这个问题划分为各自独立的小问题来解决,分治显然是不行的。又因武士和国王位置的不固定性和其走法的差异,推导不出一个数学公式。因此考虑使用枚举,需要枚举对象有:
;国王最多只会与一个骑士结合,因为骑士的最终目标也是最终汇聚点,一旦国王与某个骑士汇合后,即马上可与其结合,剩下的只需要将所有的骑士汇合就可以了。更没有必要在中途中有将国王托付给其他的骑士。 这样我们估算一下时间为O(8*8*8*8*63)=O(36*10^4),完全可以承受。
另外,我们需要预先将2点之间走马字步的距离计算出来。可以使用Floyd或是Bfs。 ;图中红色格子为假设的集结点,绿色格子为假设的某骑士跟王接头地点,蓝色的Q为前去背王的人,增量为黑色路线步数的和减去蓝色虚线的步数。; 算法流程:
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 {枚举与国王结合的武士}
If dis[knight[kk].x,knight[kk].y,x,y]min then begin
Min:= dis[knight[
文档评论(0)