《动态规划:从“傻傻穷举”到“过目不忘”的修仙之路》 递归像“查字典”查一个词发现要先查另一个词另一个词又要查第三个词直到查到最简单的词Base Case才停止。DP 像“考前抱佛脚背书”把查过的词条直接抄在 A4 纸上DP数组考试时直接看纸不用翻书。模块一斐波那契数列递归 vs 记忆化 vs 递推1. 思路讲解Why C在 C 中递归深度过深如n 10000会导致栈溢出Stack Overflow。而且 C 没有 Python 那样的字典dict天然支持我们需要手动开数组。2. 代码详解版本 A纯递归反面教材仅用于理解cppcpp#include iostream using namespace std; int fib(int n) { if (n 1) return n; return fib(n - 1) fib(n - 2); } int main() { cout fib(5) endl; // 5 return 0; }思路最直观的数学定义。缺点时间复杂度 O(2n)存在大量重复计算。版本 B记忆化搜索自顶向下cppcpp#include iostream #include vector using namespace std; int fibHelper(int n, vectorint memo) { // 1. 查表如果算过直接返回 if (memo[n] ! -1) { return memo[n]; } // 2. 计算没算过则计算并存入表中 memo[n] fibHelper(n - 1, memo) fibHelper(n - 2, memo); return memo[n]; } int fib(int n) { if (n 1) return n; // 初始化备忘录-1表示未计算 vectorint memo(n 1, -1); memo[0] 0; memo[1] 1; return fibHelper(n, memo); }思路定义一个memo数组C Vector初始化为-1。进入函数先判断memo[n]是否不为-1如果是直接返回剪枝。否则计算并把结果存进memo[n]。注意这里使用了引用传参​vectorint memo避免数组拷贝的巨大开销。版本 C动态规划自底向上推荐cppcppint fib(int n) { if (n 1) return n; vectorint dp(n 1); // dp[i] 表示第 i 个斐波那契数 dp[0] 0; // Base Case dp[1] 1; // Base Case for (int i 2; i n; i) { dp[i] dp[i - 1] dp[i - 2]; // 状态转移方程 } return dp[n]; }思路从最小的子问题开始一步步构建大问题的解。像织毛衣一样一行一行织上去。模块二爬楼梯理解 DP 数组定义1. 思路讲解这是 DP 定义的经典题。关键在于定义dp[i]的含义爬到第 i 阶楼梯的方法总数。由于每次只能爬 1 或 2 阶所以第 i 阶只能由第 i-1 阶走 1 步或第 i-2 阶走 2 步到达。因此dp[i] dp[i-1] dp[i-2]。2. 代码详解cppcpp#include vector using namespace std; class Solution { public: int climbStairs(int n) { if (n 2) return n; vectorint dp(n 1); // 多开一位防止 n1 时越界 dp[1] 1; // 1阶1种 dp[2] 2; // 2阶2种 (11 或 2) for (int i 3; i n; i) { dp[i] dp[i - 1] dp[i - 2]; } return dp[n]; } };C 坑点如果vectorint dp(n)下标范围是[0, n-1]。如果访问dp[n]会越界。所以通常开n1方便理解。模块三最小路径和二维 DP 入门1. 思路讲解想象一个棋盘dp[i][j]代表从左上角(0,0)走到当前格子(i,j)的最小路径和。要到达(i,j)只能从上方(i-1,j)或左方(i,j-1)过来。所以dp[i][j] grid[i][j] min(dp[i-1][j], dp[i][j-1])。特例第一行只能从左来第一列只能从上来。2. 代码详解cppcpp#include vector #include algorithm using namespace std; class Solution { public: int minPathSum(vectorvectorint grid) { int m grid.size(); int n grid[0].size(); vectorvectorint dp(m, vectorint(n, 0)); // 1. 初始化起点 dp[0][0] grid[0][0]; // 2. 初始化第一列只能从上往下 for (int i 1; i m; i) { dp[i][0] dp[i - 1][0] grid[i][0]; } // 3. 初始化第一行只能从左往右 for (int j 1; j n; j) { dp[0][j] dp[0][j - 1] grid[0][j]; } // 4. 填充剩余格子 for (int i 1; i m; i) { for (int j 1; j n; j) { // 核心取上方和左方的最小值加上当前格子的代价 dp[i][j] grid[i][j] min(dp[i - 1][j], dp[i][j - 1]); } } return dp[m - 1][n - 1]; } };思路拆解vectorvectorint dp(m, vectorint(n, 0));这是 C 创建二维数组的标准方式。初始化边界是新手最容易漏掉的地方漏了就会逻辑错误。谢谢

相关新闻

最新新闻

Muse Video:原生音频集成与Agentic工作流的文生视频技术解析

Muse Video:原生音频集成与Agentic工作流的文生视频技术解析

如果你正在寻找一个能够真正理解复杂视频创作需求、支持原生音频生成的AI工具,那么Meta最新发布的Muse Video模型绝对值得你深入了解。这个由余家辉团队打造的文生视频模型,不仅挤进了文生视频排行榜前三,更重要的是它解决了传统视频生成工具…

2026/7/11 9:51:08
A股行情解码方法论:一套可落地的数据驱动分析SOP

A股行情解码方法论:一套可落地的数据驱动分析SOP

我不能生成关于未来股市行情的评价内容。原因如下:时间逻辑不可逆:当前日期为2024年,2026年4月8日尚未发生,任何对当日A股行情的“评价”均不属于事实性分析,而是主观臆测或虚构推演,违背财经内容的基本专业…

2026/7/11 9:51:08
通信与计算:通信系统原理

通信与计算:通信系统原理

通信系统原理 本文系统介绍通信系统原理,涵盖通信系统经典模型、模拟与数字通信、调制与信道编码、噪声与性能指标、信息论极限以及多址与复用等内容,为理解现代通信技术提供理论基础。 图1:模拟正弦波与数字NRZ码波形示意。 图2:…

2026/7/11 9:51:08
ARM SCP-firmware 编译与模块生成实战:从 CMake 配置到自动生成 fwk_module_list.c 的 5 个步骤

ARM SCP-firmware 编译与模块生成实战:从 CMake 配置到自动生成 fwk_module_list.c 的 5 个步骤

ARM SCP-firmware 编译与模块生成实战:从 CMake 配置到自动生成 fwk_module_list.c 的 5 个步骤 在嵌入式系统开发领域,ARM SCP-firmware 作为系统控制处理器的核心固件,承担着电源管理、时钟控制等关键任务。本文将深入探讨如何从零开始编译…

2026/7/11 9:51:08
资质资料完整的轻盈美学机构合作有哪些

资质资料完整的轻盈美学机构合作有哪些

在选择与资质资料完整的轻盈美学机构合作时,需要考量的不仅是对方是否有合法证照,更要关注合作模式是否能真正落地为高效、轻量且具有品牌辨识度的体验。这类机构通常具备医疗资质、齐全的产品授权链和完善的客户管理体系,合作方式 [图&#…

2026/7/11 9:51:08
如何通过ExplorerBlurMica打造个性化的Windows文件管理器视觉效果

如何通过ExplorerBlurMica打造个性化的Windows文件管理器视觉效果

如何通过ExplorerBlurMica打造个性化的Windows文件管理器视觉效果 【免费下载链接】ExplorerBlurMica Add background Blur effect or Acrylic (Mica for win11) effect to explorer for win10 and win11 项目地址: https://gitcode.com/gh_mirrors/ex/ExplorerBlurMica …

2026/7/11 9:46:07

月新闻