LeetCode刷题--- 三步问题
2024-01-03 09:50:17
个人主页:元清加油_【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
提示:
- n范围在[1, 1000000]之间
解法
题目解析
题目意思很简单
- 有个小孩正在上楼梯,楼梯有n阶台阶。
- 小孩一次可以上1阶、2阶或3阶。
- 实现一种方法,计算小孩有多少种上楼梯的方式。
- 结果可能很大,你需要对结果模1000000007。
例如:
示例1:
输入:n = 3 输出:4 说明: 有四种走法
算法原理讲解
我们这题使用动态规划,我们做这类题目可以分为以下五个步骤
- 状态显示
- 状态转移方程
- 初始化(防止填表时不越界)
- 填表顺序
- 返回值
1.状态表示
这道题可以根据「经验 + 题?要求」直接定义出状态表?:
dp[i]
表?:到达
i
位置时,?共有多少种?法。
2.状态转移?程
以 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 - 1] + dp[i - 2] + dp[i - 3]) % MOD 是不可取的,同学们可以试验?下, n 取题?范围内最?值时,?站会报错 signed integer overflow 。 对于这类需要取模的问题,我们每计算?次(两个数相加/乘等),都需要取?次模。否则,万? 发?了溢出,我们的答案就错了。
3.初始化
从我们的递推公式可以看出,
dp[i]
在
i = 0, i = 1
以及
i = 2
的时候是没有办法进?推导的,因为 dp[-3] dp[-2]
或
dp[-1]
不是?个有效的数据。因此我们需要在填表之前,将 1, 2, 3
位置的值初始化。根据题意, dp[1] = 1, dp[2] = 2, dp[3] = 4
。
4.填表顺序
毫?疑问是「从左往右」。
5.返回值
应该返回
dp[n]
的值
代码实现
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];
}
};
文章来源:https://blog.csdn.net/weixin_74268082/article/details/135354333
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!