当前位置: 首页 > news >正文

【多维动态规划】64. 最小路径和(面试真题+面试官调整后的题目)

64. 最小路径和

难度:中等
力扣地址:https://leetcode.cn/problems/minimum-path-sum/description/

在这里插入图片描述

1. 原题以及解法

1.1 题目

给定一个包含非负整数的 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.length
  • n == grid[i].length
  • 1 <= m, n <= 200
  • 0 <= grid[i][j] <= 200

1.2 分析过程

首先应当分析简单的情况:如下图所示,长度为 2 x 2 时的最小路径和过程

在这里插入图片描述
接着我们需要计算尺寸更大情况的最小路径。
在这里插入图片描述 在这里插入图片描述
分析结论

  • 上图已经提到转移方程,即 dp[i][k] = min(dp[i-1][k], dp[i][k-1]) + grid[i][k] 。但是需要注意这个公式的适用场景:i >= 1, k >= 1
  • 对于 i == 0 以及 k == 0 的情况(第一行与第一列),通过累加的方式即可更新dp值。

1.3 解题代码

class Solution {
public:int minPathSum(vector<vector<int>>& grid) {int row = grid.size();int column = grid[0].size();vector<vector<int>> dp(row, vector<int>(column));dp[0][0] = grid[0][0];// 第一行每个点的最小路径for (int i = 1; i < column; i++) {dp[0][i] = grid[0][i] + dp[0][i - 1];}// 第一列每个点的最小路径for (int i = 1; i < row; i++) {dp[i][0] = grid[i][0] + dp[i - 1][0];}/** 对于 dp[i][k] 的计算规则为* dp[i][k] = min(dp[i - 1][k], dp[i][k - 1]) + grid[i][k]*/for (int i = 1; i < row; i++) {for (int k = 1; k < column; k++) {dp[i][k] = min(dp[i - 1][k], dp[i][k - 1]) + grid[i][k];}}return dp[row - 1][column - 1];}
};

2. 拓展(带条件的多维动态规划)

注:据可靠保熟消息,本题是一道面试题,面试官首先考察了与力扣第64题相同的,然后在这个基础上添加了这个条件,希望参与者手撕代码。

在这个题的基础上添加限制条件:存在一个或多个障碍物堵塞路径,如果题目中无路径则返回 -1

如下是一个基于力扣第64题调整后的新题目:

2.1 拓展题

问题描述

给定一个 m x n 的网格,其中每个单元格包含一个非负整数,表示到达该单元格的费用。同时,网格中可能存在若干不可通行的障碍物,障碍物用 -1 表示。你的任务是找到从左上角 (0, 0) 到右下角 (m-1, n-1) 的路径,使得路径上的数字总和最小。如果不存在路径,请返回 -1

输入

  • 一个二维数组 gridgrid[i][j] 为网格中的数值,其中 grid[i][j] >= 0 表示可通行,grid[i][j] == -1 表示不可通行的障碍物。

输出

  • 返回从左上角到右下角的路径上的数字总和的最小值。如果不存在这样的路径,返回 -1

示例 1

输入
grid = [[1, 3, 1],[1, -1, 1],[4, 2, 1]
]
输出
7
解释

最优路径为 (0,0) -> (1,0) -> (2,0) -> (2,1) -> (2,2),路径费用为 1 + 1 + 4 + 1 + 1 = 7

当然可以,这里是一个包含不可通行案例的示例:


示例 2

输入
grid = [[1, 3, -1],[2, -1, 3],[-1, 2, 1]
]
输出
-1
解释

在这个网格中,位置 (2, 0), (1, 1), (0,2) 是一个障碍物,导致从左上角 (0, 0) 到右下角 (2, 2) 的路径不可达,因此返回 -1


这样是否满足你的要求?

提示

  • mn 的范围是 [1, 100]
  • 网格中的数值在 [0, 100] 范围内。

2.2 拓展解题代码

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;/*** 基于力扣64题的变形题,详情请参考:https://smileyan.blog.csdn.net/article/details/142346755*/class Solution {
public:int minPathSum(vector<vector<int>>& grid) {int row = grid.size();int column = grid[0].size();vector<vector<int>> dp(row, vector<int>(column));dp[0][0] = grid[0][0];// 第一行每个点的最小路径int barricade = -1;for (int i = 1; i < column; i++) {if (dp[0][i - 1] == barricade || grid[0][i] == barricade) {dp[0][i] = barricade;} else {dp[0][i] = grid[0][i] + dp[0][i - 1];}}// 第一列每个点的最小路径for (int i = 1; i < row; i++) {if (dp[i - 1][0] == barricade || grid[i][0] == barricade) {dp[i][0] = barricade;} else {dp[i][0] = grid[i][0] + dp[i - 1][0];}}/** 对于 dp[i][k] 的计算规则为* dp[i][k] = min(dp[i - 1][k], dp[i][k - 1]) + grid[i][k]*/for (int i = 1; i < row; i++) {for (int k = 1; k < column; k++) {if (grid[i][k] == barricade || (dp[i - 1][k] == barricade && dp[i][k - 1] == barricade)) {dp[i][k] = barricade;} else if (dp[i - 1][k] == barricade) {dp[i][k] = dp[i][k - 1] + grid[i][k];} else if (dp[i][k - 1] == barricade) {dp[i][k] = dp[i - 1][k] + grid[i][k];} else {dp[i][k] = min(dp[i - 1][k], dp[i][k - 1]) + grid[i][k];}}}return dp[row - 1][column - 1];}
};int main() {Solution solution;vector<vector<int>> grid1 = {{1, 3, 1},{1, 5, 1},{4, 2, 1}};int result1 = solution.minPathSum(grid1);cout<<result1<<" -> 7"<<endl;vector<vector<int>> grid2 = {{1, 2, 3},{4, 5, 6}};int result2 = solution.minPathSum(grid2);cout<<result2<<" -> 12"<<endl;vector<vector<int>> grid3 = {{1, -1, 3},{4, -1, 6}};int result3 = solution.minPathSum(grid3);cout<<result3<<" -> -1"<<endl;vector<vector<int>> grid4 = {{1, -1, 3},{4, 1, 6}};int result4 = solution.minPathSum(grid4);cout<<result4<<" -> 12"<<endl;vector<vector<int>> grid5 = {{1, 3, 1},{1, 5, 2},{-1, 2, 1}};int result5 = solution.minPathSum(grid5);cout<<result5<<" -> 8"<<endl;vector<vector<int>> grid6 = {{1, 3, -1},{1, -1, 2},{-1, 2, 1}};int result6 = solution.minPathSum(grid6);cout<<result6<<" -> -1"<<endl;vector<vector<int>> grid7 = {{-1, 3, 1},{1, 1, 2},{1, 2, 1}};int result7 = solution.minPathSum(grid7);cout<<result7<<" -> -1"<<endl;vector<vector<int>> grid8 = {{1, 3, 1},{1, 1, 2},{1, 2, -1}};int result8 = solution.minPathSum(grid8);cout<<result8<<" -> -1"<<endl;return 0;
}

3. 总结

这道题应当与力扣第70题(爬楼梯)一样,作为动态规划的典型问题(热题100中多维动态规划类)。基于这道题面试官现场做了一个简单的调整,并不要求应聘者直接写代码求解出来,而是希望应聘者给出解决方案,并解释方案的可行性。

接下来的时间,还将围绕着这道题进行更多的摸索,动态规划是一个非常有意思的题:常常会因为阅读了 “参考答案” 而感到震惊。“怎么会这么简单”、“原来如此”。

感谢您的阅读、评论与点赞支持 ~ 感谢 ~

Smileyan
2024.09.21 23:48

相关文章:

【多维动态规划】64. 最小路径和(面试真题+面试官调整后的题目)

64. 最小路径和 难度&#xff1a;中等 力扣地址&#xff1a;https://leetcode.cn/problems/minimum-path-sum/description/ 1. 原题以及解法 1.1 题目 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和…...

Web后端开发技术:RESTful 架构详解

RESTful 是一种基于 REST&#xff08;表述性状态转移&#xff0c;Representational State Transfer&#xff09;架构风格的 API 设计方式&#xff0c;通常用于构建分布式系统&#xff0c;特别是在 Web 应用开发中广泛应用。REST 是一种轻量级的架构模式&#xff0c;利用标准的 …...

【Fastapi】参数获取,json和query

【Fastapi】参数获取&#xff0c;json和query 前言giteegithub query形式json传递同步方法使用json 前言 花了半个月的时间看了一本小说&#xff0c;懈怠了…今天更新下fastapi框架的参数获取 gitee https://gitee.com/zz1521145346/fastapi_frame.git github https://git…...

【Node.js】初识微服务

概述 Node.js 的微服务架构是一种通过将应用程序分解为独立的、松耦合的小服务的方式进行系统设计。 每个微服务负责处理一个特定的业务功能&#xff0c;并且这些服务可以独立开发、部署、扩展和管理&#xff0c;并且可以通讯。 它的核心思想就是解耦。 微服务和微前端是类…...

React项目实战(React后台管理系统、TypeScript+React18)

### 项目地址:(线上发布) (1)别人的项目地址 gitgitee.com:zqingle/lege-react-management.git (2)我自己的项目地址 gitgitee.com:huihui-999/lege-react-management.git ### B站讲解视频地址 https://www.bilibili.com/video/BV1FV4y157Zx?p37&spm_id_frompageDrive…...

【专题】2024中国生物医药出海现状与趋势蓝皮书报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37719 出海已成为中国医药产业实现提速扩容的重要途径。目前&#xff0c;中国医药产业发展态势良好&#xff0c;创新能力不断增强&#xff0c;然而也面临着医保政策改革和带量集采带来的压力。政府积极出台多项政策支持医药企业出海…...

【iOS】KVC

文章目录 KVC的定义 容器类中KVC的实现 KVC设值 KVC取值 KVC使用KeyPath KVC处理异常 KVC处理设值nil异常 KVC处理UndefinedKey异常 KVC处理数值和结构体类型属性 KVC键值验证 KVC处理集合 简单集合运算符 对象运算符 KVC处理字典 KVC应用 动态地取值和设值 用…...

【2024年华为杯研究生数学建模竞赛C题】完整论文与代码

这里写目录标题 基于数据驱动下磁性元件的磁芯损耗建模一、问题重述1.1问题背景1.2问题回顾 问题分析与模型假设模型建立与求解 基于数据驱动下磁性元件的磁芯损耗建模 一、问题重述 1.1问题背景 在现代电力电子和变压器设计中&#xff0c;磁性元件是确保能量高效传递和系统稳…...

svn回退到以前历史版本修改并上传

svn回退到以前版本&#xff0c;并在以前版本上修改代码后&#xff0c;上传到svn库当中&#xff0c;如下步骤&#xff1a; 3、 以回退到版本号4为例&#xff1a;选中版本号4&#xff0c;右键->Revert to this version,在出现的对话框中 点击yes&#xff01; 4、 5、...

fiddler抓包07_抓IOS手机请求

课程大纲 前提&#xff1a;电脑和手机连接同一个局域网 &#xff08;土小帽电脑和手机都连了自己的无线网“tuxiaomao”。&#xff09; 原理如下&#xff1a; 电脑浏览器抓包时&#xff0c;直接就是本机网络。手机想被电脑Fiddler抓包&#xff0c;就要把Fiddler变成手机和网络…...

Windows系统及Ubuntu系统安装Java

Java语言简介 Java是一种高级编程语言&#xff0c;Java语言的创始可以追溯到1990年代初&#xff0c;当时任职于Sun Microsystems&#xff08;后来被甲骨文公司收购&#xff09;的詹姆斯高斯林&#xff08;James Gosling&#xff09;等人开始开发一种名为“Oak”(名字来源于詹姆…...

uni-data-select 使用 localdata 传入数据出现 不回显 | 下拉显示错误的 解决方法

目录 1. 问题所示2. 正确Demo3. 下拉显示错误(Bug复现)4. 下拉不回显(Bug复现)1. 问题所示 uni-app的下拉框uni-data-select 使用 localdata 传入数据 主要总结正确的Demo以及复现一些Bug 数据不回显数据不显示下拉选项2. 正确Demo 详细的基本知识推荐阅读:uni-app中的…...

图解 TCP 四次挥手|深度解析|为什么是四次|为什么要等2MSL

写在前面 今天我们来图解一下TCP的四次挥手、深度解析为什么是四次&#xff1f; 上一片文章我们已经介绍了TCP的三次握手 解析四次挥手 数据传输完毕之后&#xff0c;通信的双方都可释放连接。现在客户端A和服务端B都处于ESTABLISHED状态。 第一次挥手 客户端A的应用进…...

DevExpress中文教程:如何将WinForms数据网格连接到ASP. NET Core WebAPI服务?

日前DevExpress官方发布了DevExpress WinForms的后续版本——将.NET桌面客户端连接到安全后端Web API服务(EF Core with OData)&#xff0c;在本文中我们将进一步演示如何使用一个更简单的服务来设置DevExpress WinForms数据网格。 P.S&#xff1a;DevExpress WinForms拥有180…...

SpringBoot3核心特性-核心原理

目录 传送门前言一、事件和监听器1、生命周期监听2、事件触发时机 二、自动配置原理1、入门理解1.1、自动配置流程1.2、SPI机制1.3、功能开关 2、进阶理解2.1、 SpringBootApplication2.2、 完整启动加载流程 三、自定义starter1、业务代码2、基本抽取3、使用EnableXxx机制4、完…...

Linux:RPM软件包管理以及yum软件包仓库

挂载光驱设备 RPM软件包管理 RPM软件包简介 区分软件名和软件包名 软件名&#xff1a;firefox 软件包名&#xff1a;firefox-52.7.0-1.el7.centos.x86_64.rpm 查询软件信息 查询软件&#xff08;参数为软件名&#xff09; ]# rpm -qa #当前系统中所有已安装的软件包 ]# r…...

pod介绍与配置

1、pod概念介绍 Pod 是 kubernetes 基本调度单位。每个 Pod 中可以运 行一个或多个容器&#xff0c;共享 Pod 的文件系统、IP 和网络等资源&#xff0c;每个 Pod 只有一个 IP。 2、使用 yaml或json 文件创建 Pod 声明式文件方式创建 Pod&#xff0c;支持 yaml 和 json 1&…...

【Taro】初识 Taro

笔记来源&#xff1a;编程导航。 概述 Taro 官方文档&#xff1a;https://taro-docs.jd.com/docs/ &#xff08;跨端开发框架&#xff09; Taro 官方框架兼容的组件库&#xff1a; taro-ui&#xff1a;https://taro-ui.jd.com/#/ &#xff08;最推荐&#xff0c;兼容性最好&…...

【设计模式-备忘录】

备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型设计模式&#xff0c;用于保存对象的内部状态&#xff0c;以便在将来某个时间可以恢复到该状态&#xff0c;而不暴露对象的内部实现细节。备忘录模式特别适合在需要支持撤销&#xff08;Undo&#xff09;操作的应…...

【数据结构】排序算法系列——快速排序(附源码+图解)

快速排序 接下来我们将要介绍的是排序中最为重要的算法之一——快速排序。 快速排序&#xff08;英语&#xff1a;Quicksort&#xff09;&#xff0c;又称分区交换排序&#xff08;partition-exchange sort&#xff09;&#xff0c;最早由东尼霍尔提出。快速排序通常明显比其…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...