1 / 83
文档名称:

搜索和动态规划.ppt

格式:ppt   大小:787KB   页数:83页
下载后只包含 1 个 PPT 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

搜索和动态规划.ppt

上传人:wefe2019 2021/7/24 文件大小:787 KB

下载得到文件列表

搜索和动态规划.ppt

相关文档

文档介绍

文档介绍:枚举、搜索与动态规划 试 题 精 讲
1
枚举
所谓枚举法,指的是从可能的解集合中一一枚举各元素,用题目给定的检验条件判定哪些是无用的,,即为其解。一般思路:
对命题建立正确的数学模型;
根据命题确定的数学模型中各变量的变化范围(即可能解的范围);
利用循环语句、条件判断语句逐步求解或证明;
枚举法的特点是算法简单,但有时运算量大。对于可能确定解的值域又一时找不到其他更好的算法时可以采用枚举法。
2
枚举法求解的问题必须满足两个条件:        ⑴可预先确定每个状态的元素个数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 an←an1 to ank do
if 状态(a1,…,ai,…,an)满足检验条件
then 输出问题的解;
3
枚举算法的优化
枚举算法的时间复杂度可以用状态总数*考察单个状态的耗时来表示,因此优化主要是
⑴减少状态总数(即减少枚举变量和枚举变量的值域)
⑵降低单个状态的考察代价
优化过程从几个方面考虑。具体讲
⑴提取有效信息
⑵减少重复计算
⑶将原问题化为更小的问题
⑷根据问题的性质进行截枝
⑸引进其他算法
4
侦探推理 (NOIP2003-2)
证词中出现的其他话,都不列入逻辑推理的内容。
明明所知道的是,他的同学中有N个人始终说假话,其余的人始终说真话。
现在,明明需要你帮助他从他同学的话中推断出谁是真正的凶手,请记住,凶手只有一个!
要求:
判断谁是罪犯?
5
分析
这道题的关键点是“如何能够快速正确实现出来” ,事实上这道题对编码能力的要求要大于对算法本身的要求。由于这道题的数据范围并不是很大,但需要进行“字符串处理”这种比较麻烦的工作,因此在比赛时就可以采用效率低一些的枚举算法来换取编码上的简单。
推荐的算法分为两步:
1.预处理每个人的每一句话,并把它们分类处理;
2.枚举罪犯和当前星期几,找出所有可能发生的情况。
下面我们来逐步细化一下每一步的算法,对于第一步,我们希望的是把一些杂乱的不好处理的“字符串信息”转化为相对比较好处理的信息。为此,我们可以通过把“信息”进行分类的方法使得对于每一类信息,更加方便的处理(即我们可以用一个或者几个变量来表示),由题目描述可以发现语句可分为三类:
6
分析
1.指明i是否是罪犯的语句;
2.指明今天是星期d的语句;
3.没有意义的语句(不符合格式要求)。
我们必须要说明的是任何不符合格式要求的语句都将被划分到第三类中去,这样在处理每个语句的时候就必须要考虑该语句是否符合格式要求,通过以上的处理,我们对于每一个语句用几个变量就可以表示了。
对于第二步的细化,我们在枚举完罪犯和当前星期几之后,就可以比较方便的判断每一句话的真伪了,这样我们再根据每个人所说的话把人进行分类。
1.没说任何一句有意义的话;
2.只说真话;
3.只说假话;
4.既说真话也说假话。
7
分析
需要注意的是,对于第一类人我们既可以把他当成说真话的,也可以把他当成说假话的,而如果第四类人存在的话,那么从他本身就可以推出矛盾了。
最后,如果对于罪犯i存在一个d使得当前情况是可能的,我们就说i就是可能的罪犯。
[时间效率]
O(MP|Day|) (其中Day={Sunday,Monday, Tuesday, Wednesday, Thursday, Friday, Saturday})
8
优化
我们可以发现在对罪犯和当前星期几进行“双重枚举”时,进行了很多重复的操作,于是我们想到,能不能不枚举是当前星期几?这样我们把这类语句与判断罪犯的语句分离,可以先由判断罪犯的语句中确定一部分人肯定说真话,一部分人肯定说假话,剩下的一部分人就要根据他所说的当前星期几的语句来判断了,首先我们假设所有人判断星期的语句不自相矛盾,这样每个人将在判断这类问题里面至多有一个答案,我们便可以统计判断当前是星期d的总人数,于是改进后的算法对于每一个可能的罪犯,先用O(p)的时间处理所有的话,再用O(|Day|)的时间枚举星期几。这样,改进后算法的复杂度就是O(m(p+|Day|))。
那么我们可不可以再进一步,把算法优化到线性?这里面可以比较明确地告诉大家,是可以做到的,具体的算法类似于上面的