题目地址:Minimum Path Sum
题目简介:
给定一个包含非负整数的网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
Example:
Input:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
Output: 7
Explanation: Because the path 1→3→1→1→1 minimizes the sum.
题目解析:
1、动态规划:
最终的目标的路径的上一步只能是它的正上或者左边,只要将初始位置到这两个位置的距离再加上目标位置的值,对比哪个小,就可以得到了结果,即
C++版:
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
if (grid.size() == 0)
return 0;
int n = grid[0].size(), m = grid.size();
//边界点先处理
for (int i = 1; i < m; ++i){
grid[i][0] += grid[i - 1][0];
}
for (int j = 1; j < n; ++j){
grid[0][j] += grid[0][j - 1];
}
for (int i = 1; i < m; ++i) {
for (int j = 1; j < n; ++j) {
grid[i][j] = min(grid[i - 1][j] + grid[i][j], grid[i][j - 1] + grid[i][j]);
}
}
return grid[m - 1][n - 1];
}
};
Java版:
class Solution {
public int minPathSum(int[][] grid) {
int n = grid[0].length, m = grid.length;
for (int i = 1; i < m; i++)
grid[i][0] += grid[i - 1][0];
for (int j = 1; j < n; j++)
grid[0][j] += grid[0][j - 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], grid[i][j - 1] + grid[i][j]);
}
}
return grid[m - 1][n - 1];
}
}
Python版:
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
n = len(grid[0])
m = len(grid)
for i in range(1, m):
grid[i][0] += grid[i - 1][0]
for j in range(1, n):
grid[0][j] += grid[0][j - 1]
for i in range(1, m):
for j in range(1, n):
grid[i][j] = min(grid[i - 1][j] + grid[i][j], grid[i][j - 1] + grid[i][j])
return grid[m - 1][n - 1]