LeetCode 热题 HOT 100 第28天:“最小路径和”

继续刷LeetCode 热题 HOT 100 的题目,并且在博客更新我的solutions。在csdn博客中我会尽量用文字解释清楚,相关Java代码大家可以前往我的个人博客jinhuaiyu.com中查看。
题目:最小路径和
给定一个包含非负整数的 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] <= 100

solution:动态规划
这道题如果用回溯法进行搜索,除非配合记忆和剪枝,不然耗时很高。既然要利用记忆,不如直接使用动态规划,这道题的解题思路和前面“不同路径”题目类似。其状态转移方程如下(用dp[][]记录从左上角到每个位置的最小路径和):
当i>0 且j=0 时,dp[i][0]=dp[i-1][0]+grid[i][0]。
当 i=0 且 j>0 时,dp[0][j]=dp[0][j−1]+grid[0][j]。
当 i>0且j>0 时,dp[i][j]=min(dp[i−1][j],dp[i][j−1])+grid[i][j]。
也就是说,除了边界情况(第一行和第一列)外,到其他位置的最小路径和取决于其左边位置和上面位置中最小路径和小的那个。我们可以通过迭代从上到下从左到右依次填充dp,这个过程中所需的左边和上面的最小路径和都已经被填充过,可以直接使用。
这个过程不需要搜索各种不同的路径进行比较,只需要比较前一步的两种可能,有一种反向贪心的思想。
这里我们没用递归进行动态规划,是因为最小路径和dp[i][j]
可能为0,此时无法区分是因为没填充的默认值0还是就是因为路径和为0。(如果一定要用递归的话,也可以先把所有位置初始化为-1,路径和不为负数,可以区分。)
Finally,带有详细注释的代码放在我的个人博客http://jinhuaiyu.com/leetcode-minimum-path-sum/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值