「这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战」
我们昨天说了爬楼梯使用递归的解法,今天说一下使用动态规划的解法。
最好配合使用递归解爬楼梯问题,一起来看。
实现思路
由于每次只能爬1或2个台阶,所以当需要爬1个台阶时,只有一种方法。当需要爬2个台阶时,只有两个方法。
当需要爬3个台阶时
- 第一次爬1个台阶,那么还剩2个台阶,此时已知爬2个台阶需要的方法数。
- 第一次爬2个台阶,那么还剩1个台阶,此时已知爬1个台阶需要的方法数。
当需要爬4个台阶时
- 第一次爬1个台阶,那么还剩3个台阶,此时已知爬3个台阶需要的方法数。
- 第一次爬2个台阶,那么还剩2个台阶,此时已知爬2个台阶需要的方法数。
······
当需要爬n个台阶时
- 第一次爬1个台阶,那么还剩n-1个台阶,此时已知爬n-1个台阶需要的方法数。
- 第一次爬2个台阶,那么还剩n-2个台阶,此时已知爬n-2个台阶需要的方法数。
由上面可知,第n个台阶 = n-1个台阶 + n-2个台阶
我们由已知第1个台阶和第2个台阶需要的方法,可以得知第3个台阶需要的方法数。
得知第3个台阶需要的方法数后,又可以得知第4个台阶,最后一直得到第n个台阶。
这就是通过动态规划的思路的解法,由已知的数据,不断的计算后面的数据,最后得出结论。
递归的思想是从第n个台阶不断往下,找到问题的边界,再通过边界反推回来。
完成代码
第432-434行代码,n小于等于2,则返回n,因为第1、第2个台阶数为已知。
第436-437行代码,我们初始定义第1、第2个台阶需要的方法数。
第438-442行代码,由于已知第1、第2个台阶数,所以从3开始遍历,每遍历一个台阶,我们就可以计算出新的台阶需要的方法数,当需要计算下一个台阶时,它的前两个台阶已发生变化,所以计算出当前台阶后,需要不断的更新前两个台阶,便于计算当前台阶的下一个台阶数。
$first变量需要继承$two变量的值,$two变量需要变成当前台阶的值。