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

动态规划基础:状态表示与转移方程解析

阐述动态规划核心思想,即通过存储中间结果避免重复计算。详细介绍了动态规划的五个实施步骤:状态表示、状态转移方程、初始化、填表顺序及返回值。结合 LeetCode 第 N 个泰波那契数与三步问题两个案例,展示了如何定义状态与推导方程,并给出了 C++ 代码实现,帮助读者掌握动态规划解题思路。

静心发布于 2026/3/30更新于 2026/7/2549 浏览
动态规划基础:状态表示与转移方程解析

1. 什么是动态规划

动态规划是一种通过将复杂问题分解为重叠子问题,并利用子问题的解来高效求解原问题的算法思想。它的核心是避免重复计算,通过存储中间结果(即'记忆化')来优化时间复杂度。

简单来说,就是通过前面的状态来定义后面的状态。例如前缀和问题也可视为一种简单的动态规划,通常归类于基础算法中。

2. 动态规划步骤

做动态规划类题目的步骤如下:

状态表示

状态表示就是数组对应位置值的含义,即该值代表什么。例如前缀和的状态表示就是原数组前面这些数的累加。

状态转移方程

状态转移方程是根据状态表示得到的公式。例如前缀和的状态转移方程为 dp[i] = dp[i-1] + nums[i]。

初始化

初始化的作用是防止数组越界访问,提前给 DP 表的一小部分值赋值,方便后续计算。例如前缀和中第 0 个位置直接设为 0。

填表顺序

填表顺序需确保计算当前位置的值时,所需的前置值已经计算完成。

返回值

返回值即题目要求的结果。

3. 例题讲解及具体代码

3.1 LeetCode 1137. 第 N 个泰波那契数

题目要求当前位置的值由前面三个位置的值决定。

  • 状态表示:当前位置值等于前面三个位置的值的和。
  • 状态转移方程:dp[i] = dp[i-1] + dp[i-2] + dp[i-3]。
  • 初始化:第 0 个位置设为 0,第 1、2 个位置设为 1。
  • 填表顺序:从前往后。
  • 返回值:第 n 个位置的值。

文章配图

基于上述步骤,代码实现如下:

class Solution {
public:
    int tribonacci(int n) {
        if (n == 0) return 0;
        if (n == 1 || n == 2) return 1;
        vector<int> dp(n + 1);
        dp[0] = 0;
        dp[1] = 1;
        dp[2] = 1;
        for (int i = 3; i <= n; ++i) {
            dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
        }
        return dp[n];
    }
};

3.2 面试题 08.01. 三步问题

题目要求计算小孩走到第 n 步的方法数。

  • 状态表示:dp[n] 表示走到当前位置时的方法数。
  • 状态转移方程:由于每次可以走 1、2 或 3 步,到达当前位置的方法数等于前三个位置方法数之和。注意不要重复计算,只需累加前三个位置的方法数即可。
  • 初始化:到第 1 步有 1 种办法,第 2 步有 2 种,第 3 步有 4 种。
  • 填表顺序:从前向后。
  • 返回值:第 n 位置的方法数。

文章配图 文章配图

明确上述要素后,即可编写代码。注意在加法过程中取模以防止溢出。

class Solution {
public:
    int waysToStep(int n) {
        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]) % 1000000007 + dp[i - 3]) % 1000000007;
        }
        return dp[n];
    }
};

目录

  1. 1. 什么是动态规划
  2. 2. 动态规划步骤
  3. 状态表示
  4. 状态转移方程
  5. 初始化
  6. 填表顺序
  7. 返回值
  8. 3. 例题讲解及具体代码
  9. 3.1 LeetCode 1137. 第 N 个泰波那契数
  10. 3.2 面试题 08.01. 三步问题
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 本地部署 Browser-Use WebUI 实现 AI 自动浏览器操作
  • 脉向AI|当豆包手机遭遇“全网封杀“:GUI Agent是通向AGI的必经之路吗?
  • 万方 AIGC 检测工具对比与选择指南
  • OpenClaw 部署报错:Cannot read properties of undefined
  • AI 大模型与传统算法的核心差异与类比解析
  • Python 数据可视化毕业设计实战:从选题到部署
  • AI 时代前端范式跃迁:从静态页面到智能交互架构
  • C++ 实验:cout 与 printf 输出速度对比
  • SpringBoot 开发环境搭建与配置
  • 2019 年信奥赛 C++ 提高组 CSP-S 初赛真题(完善程序第 1 题)
  • Agent Symbolic Learning:首个实现 AI 自主进化的端到端符号化训练框架
  • Pico 4XVR 1.10.13 安装与使用指南
  • 大模型 RAG 技术深度解析:低成本实现 AI 升级
  • Vben Admin:基于 Vue 3 的企业级中后台管理系统框架
  • AI 工具泛滥时代,为何核心能力反而贬值?
  • Windows 11 环境下 Python 3.12.5 安装与配置实战
  • LightRAG 本地部署与 WebUI 实战指南
  • SpringBoot 整合 FastExcel 实现 Excel 导入导出
  • 30 岁失业危机应对:职业重启与长期规划指南
  • 宇树机器人核心技术架构解析

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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