题目

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1、2、... 、m 个台阶。你有多少种不同的方法可以爬到楼顶呢?

解题方法

动态规划

由于爬楼梯的次数可以重复利用,最终需要达到的阶数是一定的,该问题可以描述为一个完全背包问题。背包容量为n,物品为1-m。设定动态数组dp[j]表示爬到j层的方法总数。则有如下递推关系:
70. 爬楼梯(拓展) - 图1
C++代码:

  1. class Solution {
  2. public:
  3. int climbstairs(int n) {
  4. vector<int> dp[n+1, 0];
  5. dp[0] = 1;
  6. for(int i=0; i<=n; i++) {
  7. for(int j=1; j<=m; j++) {
  8. if(i>=j) dp[i] += dp[i-j];
  9. }
  10. }
  11. return dp[n];
  12. }
  13. };