Tony的口胡呼呼(。-ω-)zzz

Posted tony-double-sky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tony的口胡呼呼(。-ω-)zzz相关的知识,希望对你有一定的参考价值。

深度优先搜索

从起始状态少的一侧开始搜索更优

例题

给你一副扑克中的 (n) 张牌, 出的下一张牌需要为前面出牌点数之和的约数, 求一种合法的方案

此题正向搜索代码如下:

void dfs(int depth, int sum){
    if(depth == n){
        output();
        return ;
        }
    REP(i, 1, n){
    if(!vis[i] && sum % a[i] == 0){
        vis[i] = 1;
        dfs(depth + 1, sum + a[i]);
        vis[i] = 0;
        }
    }
}

显然初始分支很多, 考虑逆向搜索

void dfs(int depth, int left){
    if(depth == 0){output();return ;}
    REP(i, 1, n){
    if(!vis[i] && (left - a[i]) % a[i] == 0){
        vis[i] = 1;
        dfs(depth - 1, left - a[i]);
        vis[i] = 0;
        }
    }
}
//调用
dfs(n, sum[a[i]]);

初始分支减少, 搜索量减少

以上是关于Tony的口胡呼呼(。-ω-)zzz的主要内容,如果未能解决你的问题,请参考以下文章

6441. GDOI2020模拟01.17小 ω 维护序列

康复计划#1 再探后缀自动机&后缀树

康复计划#4 快速构造支配树的Lengauer-Tarjan算法

[摸鱼]一道数学题

康复计划#5 Matrix-Tree定理(生成树计数)的另类证明和简单拓展

noip2017"退役"记