【18】动态规划DP

思考:

动态规划就是将求解大问题的最优解 转换成 多个小问题的最优解(所以是要考虑每个问题的最优解),以下为动态规划的具体解题步骤:
(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阶楼顶的方法数
}

猜你喜欢

转载自blog.csdn.net/weixin_67225910/article/details/132599472