众所周知搜索不只是dfs和bfs那么简单。
还有 meet-in-the-middle,A*,ID-dfs,IDA* ……
所以本题单就收录和整理了一些这样的搜索题。
本题单会持续更新。 简介部分也会在后续加上更多的题目说明
简单来说,迭代加深是固定搜索树的层数。一层一层增加着搜索树来寻找答案的算法(和BFS有本质的区别)。
一般我们在搜索树增长速度很快而且我们能确定答案在比较浅的节点的时候可以使用它
这题是一个比较经典的迭代加深。
你会发现题目中
而且这个时候每次要枚举两个数的和。所以搜索树增长也很快。
本题也要求
只需要输出任意一个解即可
所以很自然地可以想到迭代加深。
P1189 `SEARCH`
SP7579 YOKOF - Power Calculus
UVA1343 旋转游戏 The Rotation Game(本题也可以IDA*)
UVA11212 编辑书稿 Editing a Book(本题也可以IDA*)
对于一般的搜索算法,我们一般是从一个初始状态开始搜索,直到找到结果。
meet in the middle从初态和终态出发各搜索一半状态,让搜索树在中间相遇,这样可以有效减少搜索的深度。
P4799 [CEOI2015 Day2]世界冰球锦标赛
嗯,这题虽然是紫题,不过稍微想一下也可以想出来折半搜索(meet in the middle)的做法。
因为它的 初态 和 终态都十分明确。
那么分成两半搜,可以得到两个序列(长都是
(你看,学会这些搜索可以水好多紫题呢)。
SP4580 ABCDEF - ABCDEF
P5691 [NOI2001] 方程的解数
SP11469 SUBSET - Balanced Cow Subsets
P3067 [USACO12OPEN]Balanced Cow Subsets G
CF1006F Xor-Paths
(P3067 和 SP11469 是双倍经验(基本一样))
A*算法是一种有序搜索算法。
它会有一个估价函数。
也就是对于一个任意状态。它会估计出这个状态到目标的代价。
而A*算法有点像 heap-dijkstra
它也是维护一个堆,只不过是每次取出估价函数值最小的来扩展。
不过复杂度较劣,建议使用 IDA*。
P1379 八数码难题(本题也可以IDA*)
P2901 [USACO08MAR]Cow Jogging G
P2324 [SCOI2005]骑士精神(本题也可以IDA*)
P4467 [SCOI2007]k短路
upd-2022.1.27 :P4467 数据被加强,卡掉了时间复杂度不正确的A*做法,详情见 SF的帖子。
然后这里有另外的一道 k 短路,也撤下了A*的题解并加强数据。
不过如果你想练习A*的话可以尝试Subtask0(原版数据)。
详见: SF的另一个帖子。
如果对 k 短路相关问题感兴趣,可以看 dreamoon 的zhihu。
如果说你要更深入些,请私信我或者发邮件,我会给你 dreamoon 2021年国庆在某个地方讲课的稿件。
IDA ,顾名思义 `ID-A`
它的本质就是A*加上了迭代加深的思想。
而且比A*好写!!
UVA1343 旋转游戏 The Rotation Game
UVA11212 编辑书稿 Editing a Book
P2324 [SCOI2005]骑士精神
UVA1603 破坏正方形 Square Destroyer
(嗯你会发现IDA*似乎在之前的好多地方都有)
(也许因为它是终极优化版吧233)
upd on 2021/4/27:changed description
upd on 2021/4/27:add CF1006F
upd on 2022/1/27:P4467's new data has been add to hack A*,So I change something in this training.