思考:
动态规划就是将求解大问题的最优解 转换成 多个小问题的最优解(所以是要考虑每个问题的最优解),以下为动态规划的具体解题步骤:
(1)定义每个小问题(比如 dp[i]是有n个台阶的情况下可以走的最多方式数)
(2)找递推关系 (一般是dp[i]=dp[i-1]+dp[i-2])(3)初始化
(第一个dp[0],一般是有两个dp[0],dp[1])
(4)用(2)计算出所有的问题的最优解
(5)dp[n]即是原始大问题的最优解
题目
这里很类似斐波拉契数([i]=[i-1]+[i-2])
具体解题步骤:
(1)定义每个小问题:dp[i] 有n个台阶时走的最多方式数
(2)找递推关系:dp[i]=dp[i-1]+dp[i-2])
(3)初始化
dp[0]=1--------------------0个台阶时只有1种
dp[1]=1--------------------1个台阶时只有1种
(4)用(2)计算出所有的问题的最优解
比如:dp[2]=dp[1]+dp[0]----------有2个台阶时有1+1种走法(1+1、0+1)
(5)dp[n]即是原始大问题的最优解
for i=0;i<=n;i++{
dp[n]=dp[n-1]+dp[n-2]
}
dp[n]=dp[n-1]+dp[n-2]= dp[n-2]+dp[n-3] + dp[n-3]+dp[n-4]
= dp[n-3]+dp[n-4] +2( dp[n-4]+dp[n-5] ) + dp[n-5]+dp[n-6]
=dp[n-3]+3dp[n-4] + 3 dp[n-5] ) +dp[n-6]
//?.?
代码
func climbStairs(n int) int {
if n <= 1 {
return 1 // 如果楼梯只有0阶或1阶,只有一种方法
}
dp := make([]int, n+1) // 创建一个数组来存储每个阶梯的方法数
dp[0] = 1 // 初始状态:0阶楼梯只有1种方法(不爬)
dp[1] = 1 // 初始状态:1阶楼梯只有1种方法(爬1步)
for i := 2; i <= n; i++ {
// 每次可以选择爬1阶或2阶,所以方法数等于前两阶之和
dp[i] = dp[i-1] + dp[i-2]
}
return dp[n] // 返回n阶楼顶的方法数
}