509. 斐波那契数
思路
dp数组保存前两个数和前一个数,通过dp[0]+dp[1]计算当前数,然后更新dp数组。
时间复杂度On
空间复杂度O1
思路代码
func fib(n int) int {
if n==0{
return 0
}
dp:=[2]int{}
dp[1]=1
for i:=1;i<n;i++{
dp[0],dp[1]=dp[1],dp[0]+dp[1]
}
return dp[1]
}
70. 爬楼梯
思路
从前一阶和前二阶往上爬1步的方法数相加等于爬上当前阶的方法数。
思路代码
func climbStairs(n int) int {
if n==1{
return 1
}
dp:=[2]int{}
dp[0]=1
dp[1]=2
for i:=3;i<=n;i++{
dp[0],dp[1]=dp[1],dp[0]+dp[1]
}
return dp[1]
}
746. 使用最小花费爬楼梯
思路
优化dp数组之后:
dp[0],dp[1]=dp[1],min(dp[0]+cost[i-2],dp[1]+cost[i-1]
思路代码
func minCostClimbingStairs(cost []int) int {
dp:=[2]int{}
dp[0]=0
dp[1]=min(cost[0],cost[1])
for i:=3;i<=len(cost);i++{
dp[0],dp[1]=dp[1],min(dp[0]+cost[i-2],dp[1]+cost[i-1])
}
return dp[1]
}
func min(i,j int) int{
if i<j{
return i
}
return j
}
困难
可以从第0和第1开始,思考清楚dp数组含义,初始化dp,然后再根据递推公式循环。
今日收获
动态规划五部曲。
dp优化。