一、题目描述给定一个包含非负整数的m × n网格grid请找出一条从左上角到右下角的路径使得路径上的数字总和为最小。说明每次只能向下或者向右移动一步。示例 1输入grid [[1,3,1],[1,5,1],[4,2,1]]输出7解释因为路径 1→3→1→1→1 的总和最小。示例 2输入grid [[1,2,3],[4,5,6]]输出12约束m grid.lengthn grid[i].length1 m, n 2000 grid[i][j] 200二、问题分析这是一道经典的网格型动态规划Grid DP题目。它的核心特征最优子结构到达(i,j)的最优路径一定由到达其上方(i-1,j)或左方(i,j-1)的最优路径转移而来。重叠子问题从不同路径到达同一格子会重复求解相同子问题。无后效性一旦确定到达某格子的最小路径和后续决策不受之前路径形态影响。因为移动方向被限制为「只能向下或向右」所以不存在回路这为动态规划的递推顺序提供了天然保证。三、状态定义与转移方程3.1 状态定义设dp[i][j]表示从起点(0,0)走到格子(i,j)的最小路径和。3.2 状态转移方程要到达(i,j)只可能从上方或左方来dp[i][j] grid[i][j] min(dp[i-1][j], dp[i][j-1])3.3 边界条件起点dp[0][0] grid[0][0]第一行i 0只能从左边来dp[0][j] dp[0][j-1] grid[0][j]第一列j 0只能从上面来dp[i][0] dp[i-1][0] grid[i][0]3.4 最终答案dp[m-1][n-1]四、解法一标准二维动态规划最直观、最规范的写法。新建一个与grid同尺寸的dp数组不修改输入。class Solution { public: int minPathSum(vectorvectorint grid) { int m grid.size(), n grid[0].size(); // dp[i][j] 从 (0,0) 走到 (i,j) 的最小路径和 vectorvectorint dp(m, vectorint(n, 0)); // 初始化起点 dp[0][0] grid[0][0]; // 第一列只能从上面来 for (int i 1; i m; i) { dp[i][0] dp[i - 1][0] grid[i][0]; } // 第一行只能从左边来 for (int j 1; j n; j) { dp[0][j] dp[0][j - 1] grid[0][j]; } // 其余格子取上面和左边中较小的 for (int i 1; i m; i) { for (int j 1; j n; j) { dp[i][j] min(dp[i - 1][j], dp[i][j - 1]) grid[i][j]; } } return dp[m - 1][n - 1]; } };复杂度分析时间复杂度O(m × n)空间复杂度O(m × n)优点逻辑清晰状态定义和转移方程一一对应面试推荐首选。缺点额外占用O(m × n)空间。五、解法二一维滚动数组空间优化观察转移方程dp[i][j] min(dp[i-1][j], dp[i][j-1]) grid[i][j]dp[i][j]只依赖上一行的同列dp[i-1][j]和本行的前一列dp[i][j-1]。因此可以把二维表压缩成一维数组滚动更新。class Solution { public: int minPathSum(vectorvectorint grid) { int m grid.size(), n grid[0].size(); // dp[j] 表示当前行第 j 列的最小路径和 vectorint dp(n, 0); dp[0] grid[0][0]; // 初始化第一行 for (int j 1; j n; j) { dp[j] dp[j - 1] grid[0][j]; } // 逐行更新 for (int i 1; i m; i) { dp[0] grid[i][0]; // 第一列只能从上面来 for (int j 1; j n; j) { dp[j] min(dp[j], dp[j - 1]) grid[i][j]; // dp[j] 更新前 上一行的值上面 // dp[j-1] 更新后 本行左边的值左边 } } return dp[n - 1]; } };关键点内层循环中dp[j]在赋值前代表「上一行的dp[i-1][j]」赋值后代表「本行的dp[i][j]」。dp[j-1]已经在本次内层循环前一步更新代表「本行左边的dp[i][j-1]」。顺序必须从j 1向右保证左边先更新。复杂度分析时间复杂度O(m × n)空间复杂度O(n)优点不修改输入空间降到O(n)。缺点一维语义略抽象需要理解「滚动更新」的时机。六、解法三原地修改 grid思路与二维 DP 完全一致只是把grid本身当作dp数组使用因为每个格子的原始值在计算完自身后不会再被用到。class Solution { public: int minPathSum(vectorvectorint grid) { int m grid.size(), n grid[0].size(); for (int i 0; i m; i) { for (int j 0; j n; j) { if (i 0 j 0) continue; else if (i 0) grid[i][j] grid[i][j - 1]; // 第一行 else if (j 0) grid[i][j] grid[i - 1][j]; // 第一列 else grid[i][j] min(grid[i - 1][j], grid[i][j - 1]); } } return grid[m - 1][n - 1]; } };复杂度分析时间复杂度O(m × n)空间复杂度O(1)优点空间最优代码短。缺点修改了输入数组语义上牺牲了可读性不适合要求保留原数据的场景。七、解法四DFS 记忆化自顶向下 DP7.1 为什么需要记忆化朴素 DFS 从(0,0)出发每次向下或向右递归会形成一棵庞大的递归树。很多子问题如(1,1)会被重复访问导致时间复杂度退化为指数级O(2^(mn))在大网格上必然超时。记忆化Memoization的核心思想用一个memo数组缓存每个状态的结果遇到相同状态直接返回。7.2 记忆化通用模板返回类型 dfs(状态参数) { if (终止条件) return 终止值; // 1. 边界 if (memo[状态] ! 未计算标记) return memo[状态]; // 2. 查表 结果 合并( dfs(子状态1), dfs(子状态2), ... ); // 3. 递归 memo[状态] 结果; // 4. 写表 return 结果; // 5. 返回 }7.3 本题实现class Solution { public: int minPathSum(vectorvectorint grid) { int m grid.size(), n grid[0].size(); // memo[i][j] 从 (i,j) 走到右下角的最小路径和 // -1 表示未计算 vectorvectorint memo(m, vectorint(n, -1)); return dfs(grid, 0, 0, memo); } private: int dfs(vectorvectorint grid, int i, int j, vectorvectorint memo) { int m grid.size(), n grid[0].size(); const int INF 1e9; // 1. 边界越界返回极大值保证 min 不会选它 if (i m || j n) return INF; // 2. 终止条件到达右下角 if (i m - 1 j n - 1) return grid[i][j]; // 3. 查表 if (memo[i][j] ! -1) return memo[i][j]; // 4. 递归只能向下或向右 int down dfs(grid, i 1, j, memo); int right dfs(grid, i, j 1, memo); // 5. 写表并返回 memo[i][j] grid[i][j] min(down, right); return memo[i][j]; } };复杂度分析时间复杂度O(m × n)每个状态只算一次空间复杂度O(m × n)memo 数组O(m n)递归栈7.4 记忆化常见坑坑说明未初始化标记memo默认全 0若答案是 0 会误判为「未计算」应用-1或INF标记状态定义不完整若递归还依赖额外参数如剩余步数kmemo必须带上该维度有环图状态间可互相到达时简单记忆化会死循环需要额外visited或改迭代 DP按值传表memo必须按引用传递否则每层递归拷贝效率骤降溢出用INT_MAX作不可达标记时参与加法会溢出建议用1e9
企业数字化 ERP 产品动态
相关推荐
一条命令跑通 Windows 免费激活:MAS 激活脚本 v3.12 四通道详解 一条命令跑通 Windows 免费激活:MAS 激活脚本 v3.12 四通道详解 【免费下载链接】Microsoft-Activation-Scripts Open-source Windows and Office activator featuring HWID, Ohook, TSforge, and Online KMS activation methods, along with advanced troubleshoot… · 2026/9/27 21:24:26
OptiScaler快速上手:如何3步替换任意游戏的超分辨率并白嫖帧生成 OptiScaler快速上手:如何3步替换任意游戏的超分辨率并白嫖帧生成 【免费下载链接】OptiScaler OptiScaler bridges upscaling/frame gen across GPUs. Supports DLSS2/XeSS/FSR2 inputs, replaces native upscalers, enables FSR-FG/XeFG on non-FG titles. Support… · 2026/9/27 21:24:26
AI育儿的好处和坏处,真正的开关只有一个 一边是AI让"答案触手可及",孩子几分钟就能知道任何事情;一边是家长的隐忧——“孩子会不会被带偏”“会不会不想动脑子了”。这两种心情都是真实的。当我们面前摆着"AI育儿到底好不好"这个问题时,真正值得问的࿰… · 2026/9/27 21:24:26
【Agent】【tools】6.LlamaIndex + MCP Usage 案例目标本案例展示了如何使用LlamaIndex与MCP(Model Context Protocol)集成,实现以下目标:从MCP服务器获取工具并集成到LlamaIndex应用中将LlamaIndex工作流转换为MCP应用程序使用MCP客户端与服务器进行交互实现OAuth 2.0认证保护MCP连接管理MCP资源、提… · 2026/9/27 22:03:08
【C 语言】操作符详解(下):逗号、下标、结构体、类型转换与表达式求值 🔥 星光编译者 个人主页
📚 学习专栏: 《C/C 成长笔记》 《Linux 实践手册》 《数据结构与算法》
🌄 向云端飞扬,编译属于自己的代码星河。 ☕ 写在开篇 你好,这里是 星光编译者。 这里记录我在 C/C、… · 2026/9/27 22:03:08
Nature子刊 | 皮层间配对关联刺激(ccPAS)在脑网络中的应用 该研究首次将双位点ccPAS用于边缘型人格障碍患者,靶向右侧IFC-pre-SMA抑制控制环路,以4ms与100ms ISI对照检验通路特异性调控。结果发现两组停止信号反应时均缩短,但无组间差异,提示效应可能非通路特异。(🔗… · 2026/9/27 22:03:01
早期项目怎么找天使投资人?没有熟人资源也能跑通的路径 核心结论:早期项目怎么找天使投资人?常见路径包括结构化匹配服务、线下路演与行业网络、专业 FA 机构等。没有熟人资源的项目方,可以先通过公开渠道、行业网络或结构化匹配服务建立目标名单;进入材料和交易需求较明确的阶段后&… · 2026/9/27 22:02:55
数据质量成本(COPQ)怎么算:把 15%~20% 的营收损失拆成四类可核账成本 数据质量成本(COPQ)怎么算:把 15%~20% 的营收损失拆成四类可核账成本
标签:#数据质量 #数据治理 #成本管理 #数据管理 #数据资产 摘要: 行业口径普遍引用"数据质量问题每年造成企业 15%~20% 的营收损失"“7… · 2026/9/27 22:02:55
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01