回溯的自我介绍
回溯,也称搜索,指的是遍历决策树
回溯其实就是暴力搜索,有些题需要套 n n n次 for \texttt{for} for, for \texttt{for} for里又要 m m m次循环。这种情况就可以用 for \texttt{for} for
比如,P1036 选数就是一道很好的回溯入门题
复杂度
时间复杂度: O ( n n ) O(n^n) O(nn)
空间复杂度: O ( n ) O(n) O(n)
样例代码
#include<vector> // 回溯题推荐使用vector存储数据
vector<vector<int>> result;
// vector<int> result;
vector<int> path;
// int path;
// path记录决策树一层的数据,根据决策树的类型,来抉择path是数据还是数组
void backtracking(参数)
{
if (终止条件)
// if (path.size() == k)
// k表示决策树的长度
{
存放结果;
// result.push_back(path)
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小))
{
处理节点;
// result.push_back(path);
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
// result.pop_back();
}
}