面试题 08.01. 三步问题
📄题目描述
三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。
-
示例1:
-
输入:n = 3
输出:4
说明: 有四种走法
示例2:
-
输入:n = 5
输出:13
提示:
- n范围在[1, 1000000]之间
📒题解
动态规划的5大步骤:
- 状态表示(确定dp表里面的值所表示的含义)
- 状态解决方程(结合问题,发现重复自问题来得到)
- 初始化(保证填表时不越界)
- 填表顺序(为了确保填入当前状态时,所需状态已经填入)
- 返回值(根据题目的要求返回dp表的数据)
我们从题目中可以得知小孩一次可以走1~3步,我们可以通过模拟先来得出一到四台阶有多少种方式,分别为1、2、4、7。看到这里我们可以发现到第4台阶的方法数就等于前三个台阶方法数相加,到此我们可以推导出
d
p
dp
dp表的值的含义是,到达到第i个有
d
p
[
i
]
dp[i]
dp[i]种方法。状态表达方程
为
d
p
i
=
d
p
i
−
1
+
d
p
i
−
2
+
d
p
i
−
3
dp_i = dp_{i-1} + dp_{i-2} + dp_{i-3}
dpi=dpi−1+dpi−2+dpi−3。
class Solution {
public:
int waysToStep(int n) {
if(n < 3) //以免越界
return n;
const int MOD = 1000000007; // 题目要求取模的数
vector<int> dp(n+1, 0);
dp[1] = 1, dp[2] = 2, dp[3] = 4; // 初始化dp表
for(int i = 4; i <= n; ++i)
{
dp[i] = ((dp[i-1] + dp[i-2])% MOD + dp[i-3]) % MOD; //每次相加都要取模,否则编译器会报错
}
return dp[n];
}
};