回溯
目前是一名大四的求职学生,因为找到工作了,也没怎么去做题,没想到一遇到题居然一点不记得怎么去做,因为没学过算法,半年前就在力扣刷了两个月的题,今天同学遇到题问我,居然一瞬间忘记了怎么处理,所以做题还是要坚持啊。
题目的大概意思是,有54张牌,每次能选1-3张,拿到最后一张牌的就算胜利,你首先拿一张,我的想法直接换成了奥数思维,思考怎么去赢,这很简单,但是要打印出所有可能赢的序列,在不知道策略的情况下,因为stl最近也没怎么看,一下子就忘记了。
那么分析一下,很明显需要全排列,那么就可以用回溯来做,那么一想简单,就是dsp+回溯,54张牌作为递归的条件。
伪代码:
void dfs(int x; int n; vector<int> path){
If(n<0)
return;
else if(n==0){
If(x%2){
res.push_back(path)
}
}
for(int i=0; i<3; i++) {
path.push_back(i);
dfs(x+1, n-1, path);
path.pop_back();
}
}
x记录递归次数,奇数为胜利,将数列记录。
回溯的题做过也不少,基本就是带入回溯的模板,具体的条件在处理
void dfs(int start, vector<int> &num, vector<int> &track){
//到达临界条件
If(num.size() == track.size()) {
res.push_back(track);
return;
}
for(int i=start; i<n; i++) {
track.push_back(i);
dfs(i, nums, track);
track.pop_back();
}
}
力扣经典题,电话号码的组合,全排列,N皇后(有点烦)。
浙公网安备 33010602011771号