首页 > 代码库 > 北大ACM暑期培训课程目录(二)
北大ACM暑期培训课程目录(二)
本文出自:http://blog.csdn.net/svitter
原来的一篇可能是因为字数太长,一编辑就出问题,无奈,只好暂时写一篇新的。
今天学习的内容是搜索。
一.wide search
1.poj3307 cow深度搜索还要用栈。
广度搜速度更快。
按照层次的顺序访问节点。
走n步可以到达的点,n-1不可以到达。绝对是最优解。
可以联系图来想——周围区域扩展。
re记住已经走过的点(如果转换成树呢?)
利用队列来存点。
广搜的空间大,深搜可以用一个栈来维护。(相对于广搜空间少的多)
open表中。指向父节点的指针。(达到目标最少要走多少步。用层次编号来求。)
队头的节点是目标节点,搜索完成。可以倒序输出路径。
注意:
1.判重复的标记。
2.层级编号
3.利用STL<queue>
poj3984迷宫
求最短到达迷宫口的路径。
从队头取出状态来扩展。扩展过(visit=0)则步扩展
基本是相同的题目。
可以利用递归来输出路径(即栈)。
改变队列头的位置,但是并不是删除队列中的元素。
以上基本为数据结构的内容。
BL 4980
迷宫变种。
类似于魔塔。
队列为空时结束,在数据结构中存一个时间变量。
把x扩展为可消除的点,第一次遇见扩展出改变。相当于扩展空间。
bl6044鸣人佐助。
花费量。花费最为有效的查克拉。
什么状态。都是强调状态。迷宫问题状态是xy,对于不同的标记不同。
简单的标记无法解决问题
类似动规
r, c, k所在行列,查克拉的数量。
可以对应的状态变幻。
求钥匙的鸣人
需要集齐k种钥匙。必须集齐K种钥匙才能救佐助。(1年级期末考试题目,程序设计实习)
POJ1729
jack,jill想距离最远。
两个人最近的直线距离最远。
移动结束以后距离最远,不考虑移动过城中的距离。
状态:一对格子是一个状态。
给一个限制条件,观察是否可以走到。
假设一个限制条件。枚举k看是否满足。
枚举所有的距离k。
求k的最大值。
深搜可能会慢一点,光搜应该会快。
利用二分法查找来寻找一个更合适的值。(经典!线性的搜索)。
最近的最远距离。
注意:
格子队的判重问题。
个人的重复走问题。
利用标记判重。
POJ1077八数码
人工智能的经典问题
也是强调状态。
局面是一个状态。
状态压缩方法。
状态树。(一个比较好的方式去记录)
* 通性:状态的判重。
状态曾经出现过(不就是动规的子状态么)
一共9!
直到找到目标状态。
能是o(1)最佳。
状态的压缩表示。**数字的敏感性。
每一个状态对应一个9位数。
int 可以表示一个状态。
标志位的序列。一个元素8bit一个需要。。。
减少标志位的存储空间。状态数目只有9!
每个状态空座0-8的一个排列。
每一个排列作为一个序号。
计算出排列序号x,数组小表就是a[x/8]的第x%8位。
*给定一个序号求排列。
状态数字大小,时间的均衡。
作是否有解的判定。
*奇排列无法转换成为偶排列。(离散数学)
移动0的位置,不会改变数列的奇偶性。可以证明。
POJ数据只有1组。hdu有多组数据。
bitset<STL>
2.compare dfs and bfs
3.双向广搜
DBFS是一种扩展。
利用两个队列。
* 一个扩展队列已经扩展过,则可以停下了。
两头搜索。
为何要快呢?
扩展出的总节点数目要少。
单向搜索要m层才能找到答案,总的节点书目(1-n^m)/(1-n)
双向广搜,同样是一共扩展m曾。两边各扩展出m/2层
则总结点数目2*(1-n^m-2)/(1-n)
* 选择节点较少的那边进行扩展。
4.A*算法
启发式搜索算法的一种
每个状态n都会有一个估价函数。
优先考虑f值小额节点。
g(n)从其是状态到状态n的代价(不一定是最优的).
h(n)估计代价。
* 对估价函数进行特定限制,来确保知道最优解。
注意:
1.h(n)相容。
2.g(n)>=g*(n),g(n)>0
3.h(n)>=h*(n);
set:
multiset<>平衡二叉树
hdu3000MS过的。比双向广搜慢。
人工智能中的博弈*(可能状态数目太多)
5.迭代加深搜索算法,也会重复搜索
6.IDA*加深的A*算法
poj2286
二.深搜剪枝
1.北大ACM暑期培训课程目录(二)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。