力扣 LCR 099. 最小路径和 —— 动态规划入门详解
引言动态规划的核心在于将复杂问题分解为重叠子问题而「最小路径和」正是理解这一思想的经典范例。给定一个带权网格每次只能向下或向右移动求从左上到右下的最小路径和。这道题相比「粉刷房子」多了一个二维空间维度但状态转移更加直观——每个格子的值只依赖于其上方和左方的格子。本文将带你从 DP 表格构造到代码实现一步步掌握这道必刷题摘要本文详细解析力扣 LCR 099. 最小路径和的动态规划解法。给定m×n非负网格每次只能向下或向右走求左上到右下的最小路径和。定义dp[i][j]为到达(i,j)的最小路径和转移方程dp[i][j] grid[i][j] min(dp[i-1][j], dp[i][j-1])上格子/左格子二者取较小值。重点讲解初始化边界第一行只能从左边来第一列只能从上边来需先填好第一行、第一列这种边界值然后再开始动态规划。提供二维数组和 O(n) 空间优化两种代码时间复杂度 O(m×n)目录一、题目描述二、动态规划思路1. 为什么用 DP2. DP 数组的定义3. DP 数组的构造以示例 1 为例第一步初始化 dp 数组第二步从 (1,1) 开始递推双层循环4. 状态转移方程三、Java 代码实现四、代码优化空间压缩五、易错点总结特别重要⚠️ 注意点 1初始化边界不能忘⚠️ 注意点 2理清上一步来自哪里⚠️ 注意点 3空间优化时一维数组的含义六、复杂度分析总结一、题目描述给定一个包含非负整数的m x 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二、动态规划思路1. 为什么用 DP到达(i,j)的最小路径和只依赖于到达上方(i-1,j)和左方(i,j-1)的最小路径和。因为每次只能向下或向右所以(i,j)的上一步只能是上面或左面——这就是最优子结构适合用 DP 自顶向下推导。2. DP 数组的定义dp[i][j]从左上角 (0,0) 走到 (i,j) 的最小路径和。3. DP 数组的构造以示例 1 为例输入grid [[1,3,1], [1,5,1], [4,2,1]]第一步初始化 dp 数组① 起点dp[0][0] grid[0][0] 1② 初始化第一行只能从左边来dp[0][j] dp[0][j-1] grid[0][j]即dp[0][1] dp[0][0] grid[0][1] 1 3 4dp[0][2] dp[0][1] grid[0][2] 4 1 5③ 初始化第一列只能从上边来dp[i][0] dp[i-1][0] grid[i][0]即dp[1][0] dp[0][0] grid[1][0] 1 1 2dp[2][0] dp[1][0] grid[2][0] 2 4 6初始化完成后dp 数组为下标\下标012014512待双层循环推导待双层循环推导26待双层循环推导待双层循环推导第二步从 (1,1) 开始递推双层循环对于非边界格子(i,j)其值 grid[i][j] min(dp[i-1][j], dp[i][j-1])dp[1][1] 5 min(dp[0][1]4, dp[1][0]2) 5 2 7dp[1][2] 1 min(dp[0][2]5, dp[1][1]7) 1 5 6dp[2][1] 2 min(dp[1][1]7, dp[2][0]6) 2 6 8dp[2][2] 1 min(dp[1][2]6, dp[2][1]8) 1 6 7完整 dp 数组下标\下标012014512762687最终答案dp[2][2] 74. 状态转移方程边界情况dp[0][0] grid[0][0]第一行dp[0][j] dp[0][j-1] grid[0][j]只能从左边来第一列dp[i][0] dp[i-1][0] grid[i][0]只能从上边来通用情况dp[i][j] grid[i][j] min(dp[i-1][j], dp[i][j-1])三、Java 代码实现class Solution { public int minPathSum(int[][] grid) { //1.获取矩阵的行数和列数 int row grid.length; int col grid[0].length; //2.创建dp数组 int[][] dp new int[row][col]; //3.初始化dp数组初始化边界值第一行、第一列 //初始化左上角元素 dp[0][0] grid[0][0]; //初始化第一列 for (int i 1; i row; i) { dp[i][0] dp[i - 1][0] grid[i][0]; } //初始化第一行 for (int j 1; j col; j) { dp[0][j] dp[0][j - 1] grid[0][j]; } //4.开始动态规划的核心代码填充dp数组 for(int i1;irow;i){ for(int j1;jcol;j){ //到达当前节点的最小路径 当前格子的耗费路径 min(到达左面相邻格子的最小路径 到达上面相邻格子的最小路径) dp[i][j] grid[i][j] Math.min(dp[i][j-1], dp[i-1][j]); } } //返回结果 return dp[row-1][col-1]; } }运行结果四、代码优化空间压缩因为dp[i][j]只依赖于当前行的左方和上一行的同列所以可以用一维数组滚动更新空间复杂度降至O(n)public static int minPathSum(int[][] grid) { int m grid.length; int n grid[0].length; int[] dp new int[n]; // 初始化第一行 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] grid[i][j] Math.min(dp[j], dp[j-1]); // dp[j]旧值代表上方dp[j-1]新值代表左方 } } return dp[n-1]; }五、易错点总结特别重要⚠️ 注意点 1初始化边界不能忘很多同学直接写双层循环导致i0或j0时dp[i-1][j]或dp[i][j-1]越界。正确做法先单独初始化第一行和第一列再从(1,1)开始循环。⚠️ 注意点 2理清上一步来自哪里因为只能向下或向右走所以到达(i,j)的上一步只能是上方(i-1,j)或左方(i,j-1)不是四个方向也不是斜对角。⚠️ 注意点 3空间优化时一维数组的含义滚动数组版本中dp[j]在更新前代表上一行(i-1,j)的值dp[j-1]已经更新为当前行(i,j-1)的值所以Math.min(dp[j], dp[j-1])正好对应min(dp[i-1][j], dp[i][j-1])不要搞反顺序。六、复杂度分析版本时间复杂度空间复杂度二维数组O(m × n)O(m × n)一维滚动数组O(m × n)O(n)总结这道题是动态规划中路径类问题的入门经典核心思想是定义dp[i][j]为到达(i,j)的最小路径和先初始化边界由于第一行的每个格子只可能从左方格子而来第一列的每个格子只可能从上方的格子而来。所以此时初始化边界就是先初始化第一行、第一列的每个格子的值。通用转移dp[i][j] grid[i][j] min(dp[i-1][j], dp[i][j-1])最终答案在dp[m-1][n-1]相比「粉刷房子」本题的 DP 表格多了一个空间维度但转移关系更加直观——上一步来自哪里一目了然。掌握这道题后可以继续挑战「不同路径」「三角形最小路径和」等同类问题。希望这篇文章能帮助你更好地理解动态规划如果有问题欢迎留言讨论

相关新闻

终极指南:如何在Windows任务栏实现桌面监控和性能优化

终极指南:如何在Windows任务栏实现桌面监控和性能优化

终极指南:如何在Windows任务栏实现桌面监控和性能优化 【免费下载链接】TrafficMonitorPlugins 用于TrafficMonitor的插件 项目地址: https://gitcode.com/gh_mirrors/tr/TrafficMonitorPlugins 还在为复杂的系统监控工具烦恼吗?每次想查看CPU温度…

2026/7/26 22:44:58 阅读更多 →
Stable-Baselines3 最佳实践:避免常见陷阱的 7 个实用技巧

Stable-Baselines3 最佳实践:避免常见陷阱的 7 个实用技巧

Stable-Baselines3 最佳实践:避免常见陷阱的 7 个实用技巧 【免费下载链接】rl-tutorial-jnrr19 Stable-Baselines tutorial for Journes Nationales de la Recherche en Robotique 2019 项目地址: https://gitcode.com/gh_mirrors/rl/rl-tutorial-jnrr19 S…

2026/7/27 3:47:31 阅读更多 →
OAuth-Plugin生成器详解:快速创建OAuth提供者和消费者

OAuth-Plugin生成器详解:快速创建OAuth提供者和消费者

OAuth-Plugin生成器详解:快速创建OAuth提供者和消费者 【免费下载链接】oauth-plugin Rails plugin for OAuth 项目地址: https://gitcode.com/gh_mirrors/oa/oauth-plugin OAuth-Plugin是一款专为Rails应用设计的插件,提供了强大的生成器功能&am…

2026/7/26 19:30:58 阅读更多 →

最新新闻

论文AI检测率过高?三步实战方案降低误判

论文AI检测率过高?三步实战方案降低误判

1. 论文AI检测率过高的现状与挑战 最近一年,学术圈突然掀起了一股"AI检测风暴"。我带的几个研究生经常半夜给我发消息:"老师,查重系统显示我的论文AI生成率超过50%怎么办?"、"明明是自己写的&#xff0c…

2026/7/27 8:07:47 阅读更多 →
Postgres 18 安装 Redhat 改变PGDATA systemctl

Postgres 18 安装 Redhat 改变PGDATA systemctl

查看service---- cd /usr/lib/systemd/system postgresql-18.service sudo yum install -y postgresql18-server postgresql18 --nogpgcheck Installed: postgresql18-18.4-2PGDG.rhel8.10.x86_64 postgresql18-libs-18.4-2PGDG.rhel8.10.x86_64 postgresql18-server-1…

2026/7/27 8:07:47 阅读更多 →
从零构建64位Linux Shellcode:深入理解系统调用与位置无关代码

从零构建64位Linux Shellcode:深入理解系统调用与位置无关代码

1. 项目概述:为什么我们要亲手“锻造”Shellcode?在网络安全领域,Shellcode这个词总是带着一丝神秘和危险的气息。它通常被看作是攻击者的“武器”,一段能够直接让目标机器执行我们指令的机器码。很多初学者,甚至一些从…

2026/7/27 8:07:47 阅读更多 →
Windows下curl证书验证失败:Schannel原理、排查与修复全指南

Windows下curl证书验证失败:Schannel原理、排查与修复全指南

1. 项目概述:当curl在Windows上“哑火”时如果你在Windows环境下用curl命令访问一个HTTPS网站,突然蹦出来一个“schannel: failed to verify certificate chain”或者“schannel: SEC_E_UNTRUSTED_ROOT”之类的错误,是不是瞬间感觉头大&#…

2026/7/27 8:07:47 阅读更多 →
混沌系统与秩交织结合的图像加密算法解析

混沌系统与秩交织结合的图像加密算法解析

1. 项目概述:混沌与秩交织的图像加密新思路最近在信息安全领域,基于混沌系统的图像加密算法越来越受到关注。不同于传统的AES、DES等对称加密算法,混沌加密利用非线性动力学系统对初始条件的极端敏感性,能够生成高度随机的密钥流&…

2026/7/27 8:07:47 阅读更多 →
目标检测开源方案选型:YOLO 系列到 DETR 的实际表现对比

目标检测开源方案选型:YOLO 系列到 DETR 的实际表现对比

目标检测开源方案选型:YOLO 系列到 DETR 的实际表现对比 一、目标检测的选型,从来不止是看 mAP 做目标检测项目时,论文里的 mAP 数字总是很好看。但实际部署后,YOLOv8 在 Jetson Orin 上的推理延迟从宣称的 12ms 变成了 47ms。DET…

2026/7/27 8:06:47 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻