动态规划经典问题之爬楼梯案例

附上b站的学习链接
https://www.bilibili.com/video/BV1r84y1379W/?vd_source=33f00026602fc92e30b53bb28729c59c

爬楼梯案例

假设有一个楼梯,总共有 n 级台阶。每次你可以选择爬 1 级或 2 级台阶。你需要计算出有多少种不同的方法可以爬到楼梯的顶部。

核心思路

动态规范的核心思路是用子问题来解决母问题,采用结果反推,用到了递归的思想。其中需要确认最小子问题的结果,和用子问题和母问题的关系的公式。

假如只有1个台阶,那只有一种方式(爬1次1级)
假如有2个台阶,那有两种方式(爬2次1级,或者爬1次2级)
假如有3个台阶,这里用反推的办法,回到你只要用爬一次之前(你可能爬1次或者你可能爬2次),到达3级台阶,假如你需要爬1次(你已经到达了2级台阶),或者假如你需要爬2次(你已经到达了1级台阶),这里爬楼梯的方法,分成了两个子问题,爬1级台阶有多少种方式和爬2级台阶有多少种方式。爬3级台阶需要爬1+2= 3次
假如有4个台阶,这里还是用反推的办法,假如你最后一步爬台阶,你最后一步可能爬1级(到达了3级台阶)或者可能爬2级(到达了2级台阶),这里也分成了两个子问题,爬3级台阶和爬2级台阶有多少种方式,爬4级台阶需要爬3 + 2 = 5次

这里就总结了一个计算公式:
当n = 1 时 f( 1 ) = 1
当n = 2 是 f( 2 ) = 2
当n > 2 时 f( n ) = f( n - 1 ) + f( n -2 )

这个公式用递归很好写
判断输入的值,根据情况返回值(当n>2)时,这里用到了递归

递归的空间优化的办法:
用记忆化搜索:用一个数组保存结果,如果有i级台阶的结果,就不用继续计算了,就把i级台阶的结果返回给它了

也可以不用递归,用一个循环和数组来写,数值赋初值,从第三级台阶这里循环,用公式计算后面的结果保存在数组里面,然后继续计算,放到数组的下一个值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值