跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 动态规划:第 N 个泰波那契数与三步问题

讲解 C++ 动态规划解决第 N 个泰波那契数与三步问题。泰波那契数通过 dp[i]=dp[i-1]+dp[i-2]+dp[i-3] 递推,注意初始化与空间优化。三步问题同样使用状态转移方程计算上台阶方法数,需处理取模防止溢出。两题均采用从左往右填表顺序,提供 C++ 实现及滚动数组优化方案。

监控大屏发布于 2026/2/4更新于 2026/9/103.5K 浏览
C++ 动态规划:第 N 个泰波那契数与三步问题

01. 第 N 个泰波那契数

题目链接:

1137. 第 N 个泰波那契数 - 力扣(LeetCode)

题目描述:

文章配图

题目示例:

文章配图

算法原理(动态规划):
思路:

1. 状态表示: 这道题可以根据题目要求直接定义出状态表示:

dp[i] 表示:第 i 个泰波那契数的值

2. 状态转移方程: 题目已经给出了递推公式:dp[i] = dp[i-1] + dp[i-2] + dp[i-3]

3. 初始化 从递推公式可以看出,dp[i] 在 i=0 以及 i=1 的时候无法进行推导,因为 dp[-2] 或 dp[-1] 不是有效数据。因此需要在填表之前,将 0, 1, 2 位置的值初始化。题目中已知 dp[0] = 0, dp[1] = dp[2] = 1。

4. 填表顺序 毫无疑问是【从左往右】。

5. 返回值 应该返回 dp[n] 的值。

文章配图

解法代码(C++):
class Solution {
public:
    int tribonacci(int n) {
        // 处理边界情况
        if (n == 0)  ;
         (n ==  || n == )  ;

        
         a = , b = , c = , d = ;
         ( i = ; i <= n; i++) {
            d = a + b + c;
            a = b;
            b = c;
            c = d;
        }
         d;
    }
};
return
0
if
1
2
return
1
// 空间优化:使用滚动数组模拟
int
0
1
1
0
for
int
3
return

文章配图

空间优化根据滚动数组来进行模拟优化

文章配图


02. 三步问题

题目链接:

面试题 08.01. 三步问题 - 力扣(LeetCode)

题目描述:

文章配图

题目示例:

文章配图

算法原理(动态规划):
思路:

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]。

需要注意的是,这道题目说,由于结果可能很大,需要对结果取模。

在计算的时候,三个值全部加起来再取模是不行的。对于这类问题,我们每计算一次(两个数相加),都需要取一次模。否则,万一发生了溢出,我们的答案就错了。

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] 的值。

文章配图

解法代码(C++):
class Solution {
    const int MOD = 1e9 + 7;
public:
    int waysToStep(int n) {
        // 处理边界情况
        if (n == 1 || n == 2) return n;
        if (n == 3) return 4;

        // 空间优化:使用滚动数组模拟
        int a = 1, b = 2, c = 4, d = 0;
        for (int i = 4; i <= n; i++) {
            d = ((a + b) % MOD + c) % MOD;
            a = b;
            b = c;
            c = d;
        }
        return d;
    }
};

文章配图

目录

  1. 01. 第 N 个泰波那契数
  2. 算法原理(动态规划):
  3. 思路:
  4. 解法代码(C++):
  5. 02. 三步问题
  6. 算法原理(动态规划):
  7. 思路:
  8. 解法代码(C++):

更多推荐文章

查看全部
  • LeetCode 160:相交链表问题解析与代码实现
  • AI 实践:Claude Skills 技能详解与实践
  • Flutter 三方库 deepyr 的鸿蒙化适配指南
  • Llama 3.2 轻量化技术:修剪、蒸馏与移动端部署
  • 使用 MCP-Server 插件将 Dify 工作流发布为第三方服务
  • AI 深度早报:GTC 开幕,Agent 平台与具身模型双线引爆
  • CentOS 7.9 安装 KingbaseES ISO 包指南
  • Qwen3-VL WebUI 本地部署与核心功能实战指南
  • Dify 与 MySQL 深度融合:基于 MCP 协议实现智能数据查询
  • 零基础与其他行业转行是否适合学习 Python
  • TI 毫米波雷达自动 CLI 配置与控制代码操作方式
  • 从大数据开发转向大模型应用:职业转型路径分析
  • 谷歌AI Gemin怎么使用?Gemini国内使用指南!
  • AIGC 试用:AI 辅助软件开发流程实践
  • MAVROS 安装与基础知识梳理及 ROS C++ 仿真案例
  • Java Web 开发基础:Spring Web MVC 核心注解详解
  • PentAGI Docker 环境部署实战
  • Qwen3.5 大模型单 GPU 高效部署与股票筛选应用
  • Claude Code 安装配置与使用指南
  • 大模型实战:深入解析 LLaMA 核心算子 RMSNorm 开发

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online