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

​LeetCode解法汇总2304. 网格中的最小路径代价

目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台


描述:

给你一个下标从 0 开始的整数矩阵 grid ,矩阵大小为 m x n ,由从 0 到 m * n - 1 的不同整数组成。你可以在此矩阵中,从一个单元格移动到 下一行 的任何其他单元格。如果你位于单元格 (x, y) ,且满足 x < m - 1 ,你可以移动到 (x + 1, 0)(x + 1, 1), ..., (x + 1, n - 1) 中的任何一个单元格。注意: 在最后一行中的单元格不能触发移动。

每次可能的移动都需要付出对应的代价,代价用一个下标从 0 开始的二维数组 moveCost 表示,该数组大小为 (m * n) x n ,其中 moveCost[i][j] 是从值为 i 的单元格移动到下一行第 j 列单元格的代价。从 grid 最后一行的单元格移动的代价可以忽略。

grid 一条路径的代价是:所有路径经过的单元格的 值之和 加上 所有移动的 代价之和 。从 第一行 任意单元格出发,返回到达 最后一行 任意单元格的最小路径代价

示例 1:

输入:grid = [[5,3],[4,0],[2,1]], moveCost = [[9,8],[1,5],[10,12],[18,6],[2,4],[14,3]]
输出:17
解释:最小代价的路径是 5 -> 0 -> 1 。
- 路径途经单元格值之和 5 + 0 + 1 = 6 。
- 从 5 移动到 0 的代价为 3 。
- 从 0 移动到 1 的代价为 8 。
路径总代价为 6 + 3 + 8 = 17 。

示例 2:

输入:grid = [[5,1,2],[4,0,3]], moveCost = [[12,10,15],[20,23,8],[21,7,1],[8,1,13],[9,10,25],[5,3,2]]
输出:6
解释:
最小代价的路径是 2 -> 3 。 
- 路径途经单元格值之和 2 + 3 = 5 。 
- 从 2 移动到 3 的代价为 1 。 
路径总代价为 5 + 1 = 6 。

提示:

  • m == grid.length
  • n == grid[i].length
  • 2 <= m, n <= 50
  • grid 由从 0 到 m * n - 1 的不同整数组成
  • moveCost.length == m * n
  • moveCost[i].length == n
  • 1 <= moveCost[i][j] <= 100

解题思路:

这是一道很经典的动态规划的题目。首先我们构建一个dp数组,dp[i]代表到达第i个结点时最小路径代价。然后我们可以逐行的求值,第一行直接使用其值即可。求第二行每个位置最小路径代价时,则遍历第一行所有可能性,求到grid[1][0]所对应位置的最小值即可。

以实例1举例,grid[1][0]=4,到4这个位置最小路径有两种可能性,5+14+4=23和3+18+4=25,则最小路径为23。同理,grid[2][0]=2时,也分别尝试使用grid[1][0]和grid[1][1]两个位置求到grid[2][0]的最小路经。

最后输出最后一行的路径最小值即可。

代码:

class Solution {
public:int minPathCost(vector<vector<int>> &grid, vector<vector<int>> &moveCost){vector<int> dp(grid.size() * grid[0].size());int minPath = 10000;for (int y = 0; y < grid.size(); y++){for (int x = 0; x < grid[y].size(); x++){int value = grid[y][x];if (y == 0){dp[value] = value;continue;}int minValue = 10000;for (int k = 0; k < grid[y - 1].size(); k++){int lastValue = grid[y - 1][k];minValue = min(minValue, dp[lastValue] + moveCost[lastValue][x]);}dp[value] = minValue + value;if (y == grid.size() - 1){minPath = min(minPath, dp[value]);}}}return minPath;}
};

相关文章:

  • Spring Boot中设置文件上传大小限制
  • 一文了解 StandardTokenizer 分词器,分词原理
  • OSG粒子系统与阴影-雾效模拟(1)
  • Redis高并发缓存架构
  • 什么是arguments对象?
  • SEO从业人员提问常用的ChatGPT通用提示词模板
  • nginx知识梳理及配置详解
  • 微信小程序内部跳到外部小程序
  • 【wireshark】基础学习
  • LangChain 6根据图片生成推广文案HuggingFace中的image-caption模型
  • 【Windows】执行tasklist/taskkill提示“错误:找不到”或者“ERROR: not found”的解决方案
  • 【科技素养】蓝桥杯STEMA 科技素养组模拟练习试卷6
  • 简单使用YOLOv5自己训练模型
  • 创新研报|顺应全球数字化,能源企业以“双碳”为目标的转型迫在眉睫
  • STM32 -Bin/Hex文件格式解析
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 自己简单写的 事件订阅机制
  • dva中组件的懒加载
  • iOS小技巧之UIImagePickerController实现头像选择
  • JavaScript设计模式系列一:工厂模式
  • leetcode98. Validate Binary Search Tree
  • session共享问题解决方案
  • supervisor 永不挂掉的进程 安装以及使用
  • 记录:CentOS7.2配置LNMP环境记录
  • 如何在 Tornado 中实现 Middleware
  • 使用Swoole加速Laravel(正式环境中)
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (vue)页面文件上传获取:action地址
  • (笔试题)合法字符串
  • (十)c52学习之旅-定时器实验
  • (转)socket Aio demo
  • (转)负载均衡,回话保持,cookie
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .NET Framework与.NET Framework SDK有什么不同?
  • .net6 webapi log4net完整配置使用流程
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • /3GB和/USERVA开关
  • ?.的用法
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [ 第一章] JavaScript 简史
  • [ARM]ldr 和 adr 伪指令的区别
  • [CentOs7]图形界面
  • [codeforces]Levko and Permutation
  • [DP 训练] Longest Run on a Snowboard, UVa 10285
  • [EULAR文摘] 利用蛋白组学技术开发一项蛋白评分用于预测TNFi疗效
  • [HTML]Web前端开发技术29(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页
  • [javaSE] GUI(事件监听机制)
  • [nlp] 损失缩放(Loss Scaling)loss sacle
  • [openGL]在ubuntu20.06上搭建openGL环境
  • [P3097] [USACO13DEC] [BZOJ4094] 最优挤奶Optimal Milking 解题报告(线段树+DP)