算法---动态规划练习-1(三步问题)

三步问题

  • [1. 题目解析](#1. 题目解析)
  • [2. 讲解算法原理](#2. 讲解算法原理)
  • [3. 编写代码](#3. 编写代码)

1. 题目解析

题目地址 :三步问题

2. 讲解算法原理


1. 定义一个常量MOD为10^9+7,用于取模运算。

2. 创建一个长度为n+3的数组dp,用于存储计算过程中的中间结果。数组的下标表示台阶的级数,数组元素存储对应级数时的上楼方式数。

3. 初始化数组的前三个元素dp1、dp2和dp3分别为1、2、4,这是台阶数为1、2、3时的上楼方式数。

4. 如果n小于等于3,直接返回dpn,即台阶数为n时的上楼方式数。

5. 从i=4开始,通过循环填充数组dp的剩余元素。对于每个i,计算台阶数为i时的上楼方式数。根据题意,可以从前一级台阶跨一步上来、从前两级台阶跨两步上来,或者从前三级台阶跨三步上来。因此,dpi = (dpi-3 + dpi-2 + dpi-1) % MOD,其中% MOD是为了防止整数溢出。

6. 循环结束后,数组dp中的所有台阶数对应的上楼方式数都已计算得到。

7. 返回dpn,即n级台阶的上楼方式数。


3. 编写代码

cpp 复制代码
class Solution {
public:

    int waysToStep(int n) {
        
        const int MOD=1e9+7;
        vector<long long> dp(n+3);
        dp[1]=1,dp[2]=2,dp[3]=4;

        if(n<=3) return dp[n];
        for(int i=4;i<=n;i++)
        {
            dp[i]=(dp[i-3]+dp[i-2]+dp[i-1])%MOD;
        }
        return dp[n];
    }
};
相关推荐
I_belong_to_jesus7 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Rabitebla8 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
码客-ygluu14 小时前
一个通用游戏数据服务器
c++·架构
another heaven14 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
Code_Solitude14 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
上海潭龙东海科技有限公司14 小时前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划
YLCHUP17 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
xiaoye-duck17 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
思麟呀17 小时前
背包DP(01背包+完全背包)
c++·算法