个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客
个人专栏
力扣递归算法题
【C++】? ??
??????http://t.csdnimg.cn/6AbpV
数据结构与算法
前言:这个专栏主要讲述动态规划算法,所以下面题目主要也是这些算法做的 ?
我讲述题目会把讲解部分分为3个部分:
1、题目解析
2、算法原理思路讲解
3、代码实现
题目链接:三步问题
题目
三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。
示例1:
输入:n = 3 输出:4 说明: 有四种走法
示例2:
输入:n = 5 输出:13
提示:
题目意思很简单
例如:
示例1:
输入:n = 3 输出:4 说明: 有四种走法
我们这题使用动态规划,我们做这类题目可以分为以下五个步骤
综上所述, dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3] 。需要注意的是,这道题?说,由于结果可能很?,需要对结果取模。在计算的时候,三个值全部加起来再取模,即 (dp[i - 1] + dp[i - 2] + dp[i - 3]) % MOD 是不可取的,同学们可以试验?下, n 取题?范围内最?值时,?站会报错 signed integer overflow 。 对于这类需要取模的问题,我们每计算?次(两个数相加/乘等),都需要取?次模。否则,万? 发?了溢出,我们的答案就错了。
class Solution
{
public:
int waysToStep(int n)
{
const int MOD = 1e9 + 7;
// 1.创建dp表
// 2.初始化
// 3.填表
// 4.返回值
if (n == 1) return 1;
if (n == 2) return 2;
if (n == 3) return 4;
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];
}
};