题目描述:
三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。
示例1:
输入:n = 3
输出:4
说明: 有四种走法
示例2:
输入:n = 5
输出:13
动态规划 c++代码:
class Solution {
public:
int waysToStep(int n) {
if(n<=2)return n;
if(n==3)return 4;
long long dp[n+1];
memset(dp,0,sizeof(dp));
dp[0]=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]+dp[i-3])%1000000007;//按照最后一步上1,2,3个台阶,共有这么多走法
}
return dp[n];
}
};
递归回溯 c++代码(超时):
class Solution {
public:
int s=0;
void backtracking(int a,int n){ //递归回溯
if(a==n)s=s+1;
if(a>n)return;
backtracking(a+1,n);
backtracking(a+2,n);
backtracking(a+3,n);
}
int waysToStep(int n) {
backtracking(0,n);
return s;
}
};
使用回溯的递归,因为重复计算了一些值,所以会超时。
总结:
注意,当有多个数加和时,注意防止整数溢出,需要改用long long,并对数字取模。