观前提示:本帖会更新,但也会咕咕咕,有问题记得踢我一脚
前言:
今天集训了一天,全是搜索题,收(sheng)获(xin)颇(ju)丰(pi),真是美好的一天呢(笑)
好了,现在正式进入我们的总结帖
Part 1 搜索优化
提起搜索优化,很多人其实不屑一顾。但是相比各种难度容易上天的算法,搜索的优化其实是非常简单,易学,高效的一种快速提高暴力成绩的方法。
其中优化又大致分三类:
一.可行性优化与最优性优化(统称剪枝)
其中顾名思义,可行性优化要求你在可以判断这条道路行不通时快速回溯,以达到剪枝的目的。
而最优性优化则是要求你在答案已经劣于最优答案时快速回溯,因为这个时候你已经不可能用这个方案去更新答案了。
这两个优化放在一起是因为他们经常放在一起写。写法上两者有一些小小的不同:最优性优化要求最优的\(ans\)应该最好是一个被实时更新的全局变量,可行性优化要求对题目的性质有深刻把握。
二.搜索顺序优化
这个相比之下比较少用,但是又非常实用,可以大大减小你做无用功的行为。比如在做匹配的时候,我们可以先从大的开始匹配,然后再匹配小的,防止小的过多导致层数过多,出现TLE或者MLE甚至爆栈的现象。这个东西很多时候不被人想到,但一旦想到效率会成倍增长。
三.排除等效冗余
我们可以给方案人为的按上一些要求来使可能被计数方案数在不影响正确性的前提下
(这个是大前提,你大概率不会TLE所有的点,但是一旦答案错误将有可能0分)
变得尽量的少,常用的比如规定一个方案里面的不增/不减顺序,或者将本质相同的东西只搜索一遍等
什么?记忆化当然是一种优化方式,但是要看好能不能记忆化哦
练习题库:自行搜索,都有
数的划分
小木棍(搜索里的毒瘤题,卡常,最后一个点过不了就过不了,不要死磕)
索道
Part2 其他特殊搜索
迭代加深算法
迭代加深算法其实就是一种非常暴力智慧的办法。
我们知道dfs每向下搜一次复杂度是非常高的,而相比之下把之前搜过的东西再搜一遍其实是很快的。
而真正的bfs虽然比迭代加深快,但是空间复杂度使我们难以忍受的。
将两者结合起来,我们就得到了迭代加深算法。
我们规定一个 \(dep\) 作为最大深度,并且将 \(dep\) 一次次增大。而当\(dfs\)的深度大于\(dep\)时,我们会直接回溯。
关于为什么这样能过,我也不知道,背就对了
例题:四子连棋(自行搜索)
双向bfs
先咕咕咕,记得踢我。
其他实战题目
上一个都咕咕咕了这个你还想让我写?