hello-algo/codes/go/chapter_dynamic_programming/climbing_stairs_backtrack.go
Reanon c1adeb2399
feat(go/dp): support dynamic programming (#622)
* feat(go/dp): support climbing stairs

* feat(go/dp): support knapsack

* feat(go/dp): coin_change & edit_distance
2023-07-24 03:08:35 +08:00

36 lines
823 B
Go

// File: climbing_stairs_backtrack.go
// Created Time: 2023-07-18
// Author: Reanon (793584285@qq.com)
package chapter_dynamic_programming
/* 回溯 */
func backtrack(choices []int, state, n int, res []int) {
// 当爬到第 n 阶时,方案数量加 1
if state == n {
res[0] = res[0] + 1
}
// 遍历所有选择
for _, choice := range choices {
// 剪枝:不允许越过第 n 阶
if state+choice > n {
break
}
// 尝试:做出选择,更新状态
backtrack(choices, state+choice, n, res)
// 回退
}
}
/* 爬楼梯:回溯 */
func climbingStairsBacktrack(n int) int {
// 可选择向上爬 1 或 2 阶
choices := []int{1, 2}
// 从第 0 阶开始爬
state := 0
res := make([]int, 1)
// 使用 res[0] 记录方案数量
res[0] = 0
backtrack(choices, state, n, res)
return res[0]
}