PHP 爬楼梯(动态规划相关)- LeetCode 70

484 阅读2分钟

「这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

我们昨天说了爬楼梯使用递归的解法,今天说一下使用动态规划的解法。

最好配合使用递归解爬楼梯问题,一起来看。

image.png

实现思路

由于每次只能爬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个台阶不断往下,找到问题的边界,再通过边界反推回来。

完成代码

image.png

第432-434行代码,n小于等于2,则返回n,因为第1、第2个台阶数为已知。

第436-437行代码,我们初始定义第1、第2个台阶需要的方法数。

第438-442行代码,由于已知第1、第2个台阶数,所以从3开始遍历,每遍历一个台阶,我们就可以计算出新的台阶需要的方法数,当需要计算下一个台阶时,它的前两个台阶已发生变化,所以计算出当前台阶后,需要不断的更新前两个台阶,便于计算当前台阶的下一个台阶数。

$first变量需要继承$two变量的值,$two变量需要变成当前台阶的值。