题目描述
一个m x n的包含非负整数的网格,找一条从左上角到右下角的一条路径,使得路径上经过的网格的数字和最小。
样例
输入:网格矩阵
[[1,3,1],
[1,5,1],
[4,2,1]]
输出:7
解释:路线1→3→1→1→1,路径和最小,为7
算法
(动态规划) $O(mn)$
经典的动态规划题,用dp[i][j]记录到达网格grid[i][j]位置经过的最小的路径和,转移方程为dp[i][j] = grid[i][j] + min(dp[i-1][j], dp[i][j-1])。
C++ 代码
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size();
if(m == 0)
return 0;
int n = grid[0].size();
if(n == 0)
return 0;
vector<vector<int> > dp(m, vector<int>(n, 0));
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(i > 0){
dp[i][j] = dp[i-1][j];
}
if(j > 0){
if(i == 0)
dp[i][j] = dp[i][j-1];
else
dp[i][j] = min(dp[i][j], dp[i][j-1]);
}
dp[i][j] += grid[i][j];
}
}
return dp[m-1][n-1];
}
};
棒!
Y总,这题如果是求所有路径的话,解的方式是先求最小值,然后再dfs找路径么?有没有类似的题呀,感谢回答!
这道题目类似:LeetCode 126. Word Ladder II 。
感谢 Y总指导,自己写了一下!
很棒!