leetcode : 64 最小路径和 动态规划

2024-09-06 21:52

本文主要是介绍leetcode : 64 最小路径和 动态规划,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

64. 最小路径和

题目链接https://leetcode.cn/problems/minimum-path-sum/

题目描述

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例:

 [1,3,1][1,5,1][4,2,1]      

输出: 7

解释: 因为路径 1→3→1→1→1 的总和最小。

题目解法

从题目中我们可以知道,每次只能向下或者向右移动一步。

因此,第 i 行第 j 列的最小路径和与第 i-1 行第 j 列的最小路径和第i行第j-1列的最小路径和有关。

因此,我们可以用动态规划的方法来求解。

设 dp[i][j] 表示从左上角走到第 i 行第 j 列的最小路径和。

  1. 定义一个二维数组 dp,其中 dp[i][j] 表示从左上角走到第 i 行第 j 列的最小路径和。
  2. 则dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j],其中 grid[i][j] 表示网格中第 i 行第 j 列的元素。注意当i-1或者j-1越界时,说明无法从该点走到右下角,因此需要取最大值。
  3. 初始值 dp[0][0] = grid[0][0],其他 dp[i][j] = 0。
  4. 最后返回 dp[m-1][n-1],即为最小路径和。

代码实现

python版本:

class Solution:def minPathSum(self, grid: List[List[int]]) -> int:if not grid or not grid[0]:return 0m, n = len(grid), len(grid[0])dp = gridfor i in range(1, m):dp[i][0] = dp[i - 1][0] + grid[i][0]for j in range(1, n):dp[0][j] = dp[0][j - 1] + grid[0][j]for i in range(1, m):for j in range(1, n):dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]return dp[m - 1][n - 1]

Go版本:

func minPathSum(grid [][]int) int {m:=len(grid)n:=len(grid[0])res:=make([][]int,m)for i:=range res{res[i]=make([]int,n)}res[0][0]=grid[0][0]for i:=1;i<n;i++{res[0][i]=res[0][i-1]+grid[0][i]}for i:=1;i<m;i++{res[i][0]=res[i-1][0]+grid[i][0]}for i:=1;i<m;i++{for j:=1;j<n;j++{res[i][j]=min(res[i-1][j],res[i][j-1])+grid[i][j]}}return res[m-1][n-1]
}

C++版本:

class Solution {
public:int minPathSum(vector<vector<int>>& dp) {int m=dp.size(),n=dp[0].size();auto res=vector<vector<int>> (m,vector<int>(n));res[0][0]=dp[0][0];for(int i=1;i<m;i++){res[i][0]=res[i-1][0]+dp[i][0];}for(int j=1;j<n;j++){res[0][j]=res[0][j-1]+dp[0][j];}for(int i=1;i<m;i++){for(int j=1;j<n;j++){res[i][j]=min(res[i-1][j],res[i][j-1])+dp[i][j];}}return res[m-1][n-1];}
};

这篇关于leetcode : 64 最小路径和 动态规划的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143225

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

hdu2544(单源最短路径)

模板题: //题意:求1到n的最短路径,模板题#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#i

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];

poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)

题目很麻烦,因为不熟悉最小生成树的算法调试了好久。 感觉网上的题目解释都没说得很清楚,不适合新手。自己写一个。 题意:给你点的坐标,然后两点间可以有两种方式来通信:第一种是卫星通信,第二种是无线电通信。 卫星通信:任何两个有卫星频道的点间都可以直接建立连接,与点间的距离无关; 无线电通信:两个点之间的距离不能超过D,无线电收发器的功率越大,D越大,越昂贵。 计算无线电收发器D

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

hdu 1102 uva 10397(最小生成树prim)

hdu 1102: 题意: 给一个邻接矩阵,给一些村庄间已经修的路,问最小生成树。 解析: 把已经修的路的权值改为0,套个prim()。 注意prim 最外层循坏为n-1。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstri

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同