回溯理论基础
回溯算法比较抽象
递归和回溯相辅相成,递归函数下面回溯过程。
效率:纯暴力搜索,有些问题暴力搜索已经很不错了。
解决问题:
1.组合问题
2.切割问题:切割字符串、回文字串
3.子集问题
4.排列问题
5.棋盘问题:n皇后,解数独
如何理解回溯法?
最好抽象成一个图形结构,方便回溯模拟。
所有回溯法都可以抽象为树形结构:从上倒下递归,横向for,
函数:
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
}
int startindex记录下一次递归的起始位置
77
编号77,组合问题
回溯三部曲: