题目链接
解题思路
- 手玩一下前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]
- j = 1时, 可以由上一步的所有方案上来,因为没有连续两次2步
- 答案就是第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];
}