众所周知,深搜有个方法叫迭代加深
适用于怎么样的题目呢?
找到......输出答案,如果......输出不可行(NO/-1)
它的局限性比较大,如果题目没有说“10步以内搜不到就算无解”这类话,错误率是比较高的。
于是我进行了改进。
具体内容也很简单:
void dfs(...,int steps,bool flag){
steps++;
if(steps>1e7)flag=1;
if(flag)return;
...
}
改进很有效。
以P1902刺杀大使为例,这是一道二分答案+搜索,不考虑二分答案,直接从小到大枚举搜索,结果:
https://www.luogu.com.cn/record/58921122
我在程序里添加了上文所提到的内容,同样不用二分答案,结果:
https://www.luogu.com.cn/record/58921291
我甚至特地出了一道题:
https://www.luogu.com.cn/problem/U180518
在 O(4n) 的复杂度下,使用该方法可以几乎不损失正确率来扩大 1∼2 的数据范围,也就是平均十余倍的效率提升。
它的高效是显然的:把搜索树的 总规模 限制在指定范围内。即使我们只搜索了 10% 的状态,这些状态依然可以 基本覆盖 最优解(因为有大量冗余状态是及其相似的)。而对于无解的情况,那就更好了。
然而这个乱搞还是存在一些不足,目前机房一位大佬利用一些方法继续改进,但是仍然有一个点需要特判。(代码二楼)
对于大多数题目,给暴搜加上这东西都能获得 10∼30 分的提升甚至直接AC。并且它很难卡。