1. 题目链接:面试题 08.01. 三步问题
2. 题目描述:
三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。
示例1:
输入:n = 3 输出:4 说明: 有四种走法
示例2:
输入:n = 5 输出:13
提示:
- n范围在[1, 1000000]之间
3. 算法(动态规划)
3.1 算法思路:
-
状态表示
这道题可以根据【经验+题目要求】直接定义出状态表示:
dp[i]
表示:达到i
位置时,一共多少种方法 -
状态转移方程
以
dp[i]
表示小孩上第i
阶楼梯的所有方式,那么它应该等于所有上一步的方式之和:上一步上一级台阶,
dp[i]+=dp[i-1]
;上一步上两级台阶,
dp[i]+=dp[i-2]
;上一步上三级台阶,
dp[i]+=dp[i-3]
;综上所述,
dp[i]=dp[i-1]+dp[i-2]+dp[i-3]
; -
初始化
dp[i]
在i=0,i=1,i=2
的时候没有办法进行推导的,因此我们在填表之前,将1,2,3
位置的值初始化dp[i]=1,dp[2]=2,dp[3]=4
-
填表顺序
从左往右
-
返回值
应该返回
dp[n]
的值
3.2 C++算法思路:
class Solution {
const int MOD=1e9+7;
public:
int waysToStep(int n) {
if(n==1||n==2) return n;
if(n==3) return 4;
//创建dp表
vector<int>dp(n+1);
//初始化
dp[1]=1,dp[2]=2,dp[3]=4;
//填表
for(int i=4;i<=n;i++)
dp[i]=((dp[i-1]+dp[i-2])%MOD+dp[i-3])%MOD;
//返回结果
return dp[n];
}
};