当前位置: 首页 > 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文件格式解析
  • [译] 怎样写一个基础的编译器
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • CentOS7简单部署NFS
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript中的对象个人分享
  • Java教程_软件开发基础
  • JS数组方法汇总
  • markdown编辑器简评
  • Mysql5.6主从复制
  • Python 反序列化安全问题(二)
  • 代理模式
  • 翻译:Hystrix - How To Use
  • 免费小说阅读小程序
  • 批量截取pdf文件
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 主流的CSS水平和垂直居中技术大全
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​iOS实时查看App运行日志
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • # 计算机视觉入门
  • #include
  • (0)Nginx 功能特性
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (论文阅读11/100)Fast R-CNN
  • (算法)N皇后问题
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (一)为什么要选择C++
  • (转)【Hibernate总结系列】使用举例
  • (转)母版页和相对路径
  • .NET Framework 服务实现监控可观测性最佳实践
  • .net mvc 获取url中controller和action
  • .NET MVC第五章、模型绑定获取表单数据
  • .net 发送邮件
  • .Net程序帮助文档制作
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET的微型Web框架 Nancy
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .net网站发布-允许更新此预编译站点
  • .net中调用windows performance记录性能信息
  • .net中生成excel后调整宽度