个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客
个人专栏
力扣递归算法题
http://t.csdnimg.cn/yUl2I
【C++】
http://t.csdnimg.cn/6AbpV
数据结构与算法
http://t.csdnimg.cn/hKh2l
前言:这个专栏主要讲述动态规划算法,所以下面题目主要也是这些算法做的
我讲述题目会把讲解部分分为3个部分:
1、题目解析
2、算法原理思路讲解
3、代码实现
三步问题
题目链接:三步问题
题目
三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。
示例1:
输入:n = 3 输出:4 说明: 有四种走法
示例2:
输入:n = 5 输出:13
提示:
- n范围在[1, 1000000]之间
解法
题目解析
题目意思很简单
- 有个小孩正在上楼梯,楼梯有n阶台阶。
- 小孩一次可以上1阶、2阶或3阶。
- 实现一种方法,计算小孩有多少种上楼梯的方式。
- 结果可能很大,你需要对结果模1000000007。
例如:
示例1:
输入:n = 3 输出:4 说明: 有四种走法
算法原理讲解
我们这题使用动态规划,我们做这类题目可以分为以下五个步骤
- 状态显示
- 状态转移方程
- 初始化(防止填表时不越界)
- 填表顺序
- 返回值
- 上⼀步上⼀级台阶, 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 - 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];}
};