509 斐波那契數列
func fib(n int) int {
// dp五部曲
// 1 dp陣列含義以及下標含義: 本題儲存的是完整的斐波那契數列,i 對應數列的第i個數字
// 2 遞推公式: F(n) = F(n - 1) + F(n - 2)
// 3 dp陣列初始化: 由遞推公式推到,0, 1 兩位需要手動賦值,否則,oor
// 4 遍歷順序: 求第n個數字,需要將數列遍歷建立到第n個位置
// 5 列印dp陣列
var resli = []int{0, 1}
for i := 2; i <= n; i++ {
resli = append(resli, resli[i-1] + resli[i-2])
}
return resli[n]
}
70 爬樓梯
func climbStairs(n int) int {
// dp五部曲
// 確定dp陣列以及下標含義: dp儲存當前已經爬的階梯數
// 遞推公式: f(n) = f(n - 1) + f(n - 2) // 即本次爬兩步需要的方法 + 本次爬一步需要的方法總數
// dp陣列初始化: f(0) = 0, f(1) = 1
// 遍歷順序: 從前往後
// 列印dp
var res = []int{0, 1, 2}
for i := 3; i<=n; i++ {
res = append(res, res[i-1] + res[i-2])
}
return res[n]
}
746 最小代價爬樓梯
func minCostClimbingStairs(cost []int) int {
// dp陣列以及下標含義: dp儲存了爬到i樓累計最小體力消耗
// 遞推公式: mc(k) = min(mc[k-1] + cost[k-1], mc[k-2]+cost[k-2]), 從k-1消耗體力爬一層 或者 從k-2消耗體力爬兩層
// dp初始化: 題目給出了0,1兩層都可以作為起點,所以0-1需要最小體力和都是0
// 遍歷順序: 從前往後
// 列印dp
var mincost = []int{0, 0}
for i := 2; i <= len(cost); i++ {
mincost = append(mincost, min(cost[i-1] + mincost[i-1], cost[i-2] + mincost[i-2]))
}
fmt.Println(mincost)
return mincost[len(cost)]
}
func min (x, y int )int {
if x < y {
return x
}
return y
}