递推
根据题目能写出递推式与边界情况,那么就可以用递推来解决问题
递归
递归这里最简单的三种应用:
1.指数型枚举,思路是我们利用递归函数,一个一个处理要枚举的数,每个数都有两种情况,选或者不选,最后我们枚举完了所有的数,也就是到了边界,就可以处理/输出当前的情形了
2.组合型枚举,这个问题的解决是在上一个枚举的基础上,加上一个剪枝得到的,每次我们进入函数的时候首先判断一下,如果当前选的数目大于要选择的目标数目,或者当前选的数目加上还未选的数目小于要选择的目标数目,则返回
3.排列型枚举,这个问题的思路是,函数的参数是位置,当位置大于我们排列的数目时,就到了边界,可以统计当前结果了,除此之外,我们枚举可以填的数字,如果已经填过,那么跳过这个循环,没有填过,那么填上,并改变标志数组,
排列型枚举的解决问题的思路和深入浅出程序设计竞赛上面回溯法的模板很相似,那个模板是,函数的参数是递归的层数,或者说要填的第几个空。递归的边界是,所有的空都被填完了,这时记录更新答案,判断最优解。接下来是枚举这个空能填的选项,可以填,就填,保存现场,递归,恢复现场,
void dfs(int k) { // k表示递归的层数,或者说要填第几个空
if (所有的空都填完了) {
记录更新答案/判断最优解;
return;
}
for (枚举当前空能填的选项) {
if (这个选项合法) {
记录下这个空,保存现场;
dfs(k + 1);
取消这个空,恢复现场;
}
}
}