动态规划(简单)
前言
纯个人笔记,记录自己动态规划学习次序与题目(大多为力扣的题目)方便复习查找。
本人学习使用的是c++,纯纯纯新手有写的不对的地方,非常欢迎来提醒
对于我这个新手来说大部分的题是很难做出来,肯定会借鉴相应的题解和解析,如果有争议,我会删除
题目
三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。
示例1:
输入:n = 3
输出:4
说明: 有四种走法
示例2:
输入:n = 5
输出:13
提示:
n范围在[1, 1000000]之间
代码
class Solution {
public:
int waysToStep(int n)
{
if(n<=2)//特殊情况,返回
return n;
if(n==3)//特殊情况,返回
return 4;
vector<long long > 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]+dp[i-3])%1000000007;
}
return dp[n];
}
};
解释
1、dp定义
因为计算小孩有多少种上楼梯的方式,dp[i]代表到第 i 个台阶的上楼梯的方法数。因为 i 最大为 n ,而 n 范围在[1, 1000000]之间,数量巨大所以定义long long 类型。
2、递推公式
dp[i]=(dp[i-1]+dp[i-2]+dp[i-3])%1000000007;
与爬楼梯和使用最小花费爬楼梯 题特别相似,只不过有三种跳法;
(1) 从 i-1 开始,爬一阶台阶,到达 i ,i-1 之前有dp[i-1]种方法;
(2) 从 i-2 开始,爬两阶台阶,到达 i ,i-1 之前有dp[i-2]种方法 ;
(3) 从 i-3 开始,爬三阶台阶,到达 i ,i-1 之前有dp[i-3]种方法;
即 dp[i]为以上三种情况之和->dp[i]=dp[i-1]+dp[i-2]+dp[i-3];
因为题目要求你需要对结果模1000000007。 所以dp[i]=(dp[i-1]+dp[i-2]+dp[i-3])%1000000007;
3、dp初始化
因为递推公式是由 dp[i-1] 和 dp[i-2] 和 dp[i-3] 决定的,所以初始化 dp[1] 和 dp[2] 和 dp[3] 。
dp[1]是到第一个台阶的时候的上楼梯的几种方法,1,共一种->dp[1]=1;
dp[2]是到第两个台阶的时候的上楼梯的几种方法,1-1,2,共两种->dp[2]=2;
dp[3]是到第三个台阶的时候的上楼梯的几种方法,1-1-1,1-2,2-1,3 共四种->dp[3]=4;