64. Minimum Path Sum
题目
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.
解题思路
采用动态规划的方法。用 dist[row][col]
表示从矩阵左上角到矩阵第row行,第col列的最小路径和。初始时dist[0][0] = grid[0][0]
, 求dist[row][col]
可以这样分解为子问题:对矩阵的第一行,第col列只能从第col-1列到达,因此dist[row][col] = dist[row][col-1] + grid[row][col]
;对矩阵第一列,第row行只能从第row-1行到达,因此dist[row][col] = dist[row-1][col] + grid[row][col]
;对矩阵的其余点,点(row, col)可以从(row-1, col)和(row, col-1)到达,因此dist[row][col]
为dist[row-1][col]
和dist[row][col-1]
中较小的值加上grid[row][col]
。通过上述动态规划,最终得到从矩阵左上角到矩阵右下角的最小路径和。
代码如下:
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
vector<vector<int>> dist = grid;
for (int row = 1; row < grid.size(); row++) {
dist[row][0] = dist[row-1][0] + grid[row][0];
}
for (int col = 1; col < grid[0].size(); col++) {
dist[0][col] = dist[0][col-1] + grid[0][col];
}
for (int row = 1; row < grid.size(); row++) {
for (int col = 1; col < grid[0].size(); col++) {
dist[row][col] = min(dist[row-1][col], dist[row][col-1]) + grid[row][col];
}
}
return dist[grid.size()-1][grid[0].size()-1];
}
};