题目
给定一个包含非负整数的 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
分析
本题是让找出一条从左上角到右下角的路径,使得路径上的数字总和最小。
这是一道典型的动态规划问题,我们定义 dp[i][j] 表示从左上角到位置 [i,j]的最小值,因为题中说了每次只能向下或向右移动,所以要想到位置 [i,j],可以从上面下来,也可以从左边过来,我们取他的最小值即可,递推公式如下图所示:
对于第一行的每个位置,没法从上面下来,只能从左边过来,同理第一列的每个位置只能从上面下来,所以第一行和第一列要单独处理。
代码
public int minPathSum(int[][] grid) {
int m = grid.length, n = grid[0].length;
for (int i = 1; i < m; i++)// 第一列只能从上面下来
grid[i][0] += grid[i - 1][0];
for (int i = 1; i < n; i++)// 第一行只能从左边过来
grid[0][i] += grid[0][i - 1];
for (int i = 1; i < m; i++)
for (int j = 1; j < n; j++)// 递推公式
grid[i][j] = Math.min(grid[i - 1][j], grid[i][j - 1]) + grid[i][j];
return grid[m - 1][n - 1];
}
原文:https://mp.weixin.qq.com/s/fZ_wK7U3yw6QKvWJBHourw