题目:
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-path-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:很典型的动态规划题型,蛮简单,就不过多赘述。
直接上状态转移方程:
①初始化上边界:
dp[0][i] = dp[0][i-1] + grid[0][i]
初始化左边界:
dp[i][0] = dp[i-1][0] + grid[i][0]
②
除上、左边界外:
dp[i][j] = min(dp[i-1][j]+grid[i][j], dp[i][j-1]+grid[i][j])
实现:
JAVA版:
class Solution {
public int minPathSum(int[][] grid) {
int row = grid.length;
int column = grid[0].length;
int [][]dp = new int[row][column];
//初始化边界
dp[0][0] = grid[0][0];
for(int i = 1;i < column;i++){
dp[0][i] = dp[0][i-1] + grid[0][i];
}
for(int i = 1;i < row;i++){
dp[i][0] = dp[i-1][0] + grid[i][0];
}
// dp[i][j] = max(dp[i][j-1]+grid[i][j], dp[i-1][j]+grid[i][j])
for(int nr = 1; nr < row;nr++){
for(int nc = 1;nc < column;nc++){
dp[nr][nc] = Math.min(dp[nr][nc-1]+grid[nr][nc], dp[nr-1][nc]+grid[nr][nc]);
}
}
// for(int i = 0;i < row;i++){
// for(int j = 0;j < column;j++)
// System.out.print(dp[i][j]+" ");
// System.out.println();
// }
return dp[row-1][column-1];
}
}
C++版:
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int row = grid.size();
int column = grid[0].size();
int dp[row][column];
//和java不同的是,需要手动初始化
for(int i = 0;i < row;i++)
for(int j = 0;j < column;j++)
dp[i][j] = 0;
//再初始化原点、上边界、左边界
dp[0][0] = grid[0][0];
for(int i = 1;i < column;i++)
dp[0][i] = dp[0][i-1] + grid[0][i];
for(int i = 1;i < row;i++)
dp[i][0] = dp[i-1][0] + grid[i][0];
for(int i = 1;i < row;i++){
for(int j = 1;j < column;j++){
int left = dp[i][j-1] + grid[i][j];
int up = dp[i-1][j] + grid[i][j];
dp[i][j] = left>up? up:left;
}
}
return dp[row-1][column-1];
}
};
python版:
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
row = len(grid)
column = len(grid[0])
dp = [[0 for _ in range(column)] for _ in range(row)]
dp[0][0] = grid[0][0]
for i in range(1, column):
dp[0][i] = dp[0][i-1] + grid[0][i]
for i in range(1, row):
dp[i][0] = dp[i-1][0] + grid[i][0]
for i in range(1, row):
for j in range(1, column):
dp[i][j] = min(dp[i-1][j]+grid[i][j], dp[i][j-1]+grid[i][j])
return dp[row-1][column-1]
conclusion:
这几天做的题都比较简单,就这一篇涉及到一个动态规划,而动态规划是算法设计里面比较难的部分,所以写了这篇博文。
半水吧233333~