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 1:
[[1,3,1],
[1,5,1],
[4,2,1]]
Given the above grid map, return 7
. Because the path 1→3→1→1→1
minimizes the sum.
题目分析
暴力解法
一个格子可以从上面个格子走来,也可以从左边的格子走来,如果是 N∗N 地图,共有 2N−1 中选择。
动态规划
由于上一个点只能是上方或者左方的格子,那么到达该格子的最短路径即使从两个方向来的最短的一个。即是,
distance[i][j]=min(from[i−1][j],from[i][j−1])
初始状态:起点的距离为0
实现如下:
class Solution {
public:
int minPathSum(vector<vector<int>> &grid) {
const auto size_r = grid.size(), size_c = grid[0].size();
auto map = vector<vector<int>>(size_r, vector<int>(size_c, 0));
for (int i = 1; i < size_c; ++i) {
map[0][i] = map[0][i - 1] + grid[0][i - 1];
}
for (int i = 1; i < size_r; ++i) {
map[i][0] = map[i - 1][0] + grid[i - 1][0];
for (int j = 1; j < size_c; ++j) {
map[i][j] = std::min(map[i - 1][j] + grid[i - 1][j],
map[i][j - 1] + grid[i][j - 1]);
}
}
// for (auto& i : map) {
// for (auto& j : i) {
// std::cout << j << " ";
// }
// std::cout << std::endl;
// }
return map[size_r - 1][size_c - 1] + grid[size_r - 1][size_c - 1];
}
};