今日题目:
509. 斐波那契数
70. 爬楼梯
746. 使用最小代价爬楼梯
今日总结
动态规划第一天。动态五部曲:
- 确定dp数组的含义以及下标含义
- 确定公式,必然包含dp数组前几项
- dp数组初始化
- 确认遍历顺序
- 举例推导dp数组
59. 斐波那契数
要点
- 没啥说的 熟悉流程
代码:
func fib(n int) int {
dp := make([]int, 2)
dp[0] = 0
dp[1] = 1
for i:=2;i <=n ;i++{
dp = append(dp,dp[i-1]+dp[i-2])
}
return dp[n]
}
70. 爬楼梯
要点:
- 要想好dp数组代表什么
func climbStairs(n int) int {
if n <=1 {
return n
}
dp := make([]int, n+1)
dp[1] = 1
dp[2] = 2
for i :=3;i <=n;i++{
dp[i] = dp[i-1]+dp[i-2]
}
return dp[n]
}
746. 使用最小花费爬楼梯
要点:
- 注意最后一跳可以跳过,所以这里return的值是这样写的
func minCostClimbingStairs(cost []int) int {
dp := make([]int, len(cost))
dp[0] = cost[0]
dp[1] = cost[1]
for i := 2; i < len(cost); i++ {
dp[i] = min(dp[i-1], dp[i-2]) + cost[i]
}
return min(dp[len(cost)-1], dp[len(cost)-2]) // 修改这里
}
func min(a int, b int) int {
if a < b {
return a
}
return b
}