Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time.
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.
题目链接:https://leetcode-cn.com/problems/minimum-path-sum/
思路
和一维的DP思路一致,算出走到当前步时最小代价的路径,记录即可。
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size();
if(m==0) return 0;
int n = grid[0].size();
int res[m][n];
res[0][0] = grid[0][0];
for(int i=0; i<m; ++i){
for(int j=0; j<n; ++j){
if(i==0 && j==0) continue;
int tmp = INT_MAX;
if(i>0) tmp = min(res[i-1][j]+grid[i][j], tmp);
if(j>0) tmp = min(res[i][j-1]+grid[i][j], tmp);
res[i][j] = tmp;
}
}
return res[m-1][n-1];
}
};
空间优化
不开新空间,原地覆盖。
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size();
if(m==0) return 0;
int n = grid[0].size();
for(int i=0; i<m; ++i){
for(int j=0; j<n; ++j){
if(i==0 && j==0) continue;
int tmp = INT_MAX;
if(i>0) tmp = min(grid[i-1][j]+grid[i][j], tmp);
if(j>0) tmp = min(grid[i][j-1]+grid[i][j], tmp);
grid[i][j] = tmp;
}
}
return grid[m-1][n-1];
}
};

本文详细解析了LeetCode上的经典问题“最小路径和”,提供了高效的动态规划算法实现,包括标准DP和空间优化的原地覆盖方法,并附带完整的代码示例。

370

被折叠的 条评论
为什么被折叠?



