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的主要内容,如果未能解决你的问题,请参考以下文章
康复计划#4 快速构造支配树的Lengauer-Tarjan算法