程式碼隨想錄day32 || 509 斐波那契數列,70 爬樓梯,746 最小代價爬樓梯

周公瑾55發表於2024-08-17

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 爬樓梯

image

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 最小代價爬樓梯

image

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
}

相關文章