[动态规划]: 124. 有限制的楼梯攀爬

121 阅读2分钟

题目链接

有限制的楼梯攀爬

解题思路

  • 手玩一下前4阶楼梯的方案数
    • 第1阶,只能走1步上来
    • 第2阶,能从第1阶走1步上来,也可以直接走2步上来,分别记为f1 , f2
    • 第3阶,能从第2阶走1步上来,也可以从第1阶走2步上来
    • 第4阶,能从第3阶走1步上来,不能从第2阶走2步部分情况上来,因为第二阶有之前走2步的情况f2,但是可以由走1步的情况上来的f1
    • 简单来说, 第2阶有两种情况:走1步上到第2阶的和走2步上到第2阶的,我们在第4阶的时候只能由走1步上到第2阶的情况走2步到第4阶,题目限制了不能连续走两次2步
  • 由第4阶的情况可以看出,我们要分别记录第i阶由1步上来的方案数和由2步上来的方案数
  • f[i][j]表示走j步到第i阶楼梯的方案数
    • j = 1时, 可以由上一步的所有方案上来,因为没有连续两次2步
      f[i][1] = f[i-1][i] + f[i-1][2]
    • j = 2时, 只能由上一步j=1的方案上来
      f[i][2] = f[i-1][1]
  • 答案就是第n阶由1步和2步走上来的总方案数 f[n][1] + f[n][2]
  • 初始化时,第1阶不能走2步 所以 f[1] = [1,0]
  • 第2阶能走1步上来,也可以走2步, 所以 f[2] = [1,1]

##题解代码

int solution(int n) {
    if (n == 1) return 1;
    if (n == 2) return 2;

    vector<vector<int>> f(n + 1, vector<int>(3));
    f[1][1] = 1; 
    f[2][1] = 1;
    f[2][2] = 1; 
    for (int i = 3; i <= n; i++) {
        f[i][1] = f[i - 1][1] + f[i - 1][2];
        f[i][2] = f[i - 2][1];
    }
    return f[n][1] + f[n][2];
}