乱搞深搜新方法?
  • 板块学术版
  • 楼主JoeBiden2020
  • 当前回复4
  • 已保存回复4
  • 发布时间2021/11/7 22:59
  • 上次更新2023/11/4 01:07:26
查看原帖
乱搞深搜新方法?
432183
JoeBiden2020楼主2021/11/7 22:59

众所周知,深搜有个方法叫迭代加深

适用于怎么样的题目呢?

找到......输出答案,如果......输出不可行(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)O(4^n) 的复杂度下,使用该方法可以几乎不损失正确率来扩大 121\sim 2 的数据范围,也就是平均十余倍的效率提升。

它的高效是显然的:把搜索树的 总规模 限制在指定范围内。即使我们只搜索了 10%10\% 的状态,这些状态依然可以 基本覆盖 最优解(因为有大量冗余状态是及其相似的)。而对于无解的情况,那就更好了。

然而这个乱搞还是存在一些不足,目前机房一位大佬利用一些方法继续改进,但是仍然有一个点需要特判。(代码二楼)

对于大多数题目,给暴搜加上这东西都能获得 103010\sim30 分的提升甚至直接AC。并且它很难卡。

2021/11/7 22:59
加载中...