题目
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.
解答
方法一:递归
这个方法会超过时间限制
调用moveStep(grid,1,1)
;
int moveStep(vector<vector<int>>& grid, int m, int n) {
int row = grid.size();
int col = grid[0].size();
int a = 0;
int b = 0;
if (row == m && col == n)
return grid[m - 1][n - 1];
if (m < row && n < col) {
a = moveStep(grid, m + 1, n);
b = moveStep(grid, m, n + 1);
if (a > b)
a = b;
}
else if(m < row && n == col) {
a = moveStep(grid, m + 1, n);
}
else if (m == row && n < col) {
a = moveStep(grid, m, n + 1);
}
return grid[m - 1][n - 1] + a;
}
方法二:动态规划
int minPathSum(vector<vector<int> > &grid) {
if (grid.size() == 0)
return 0;
vector<vector<int>> res(grid);
int i, j;
for (int j = 1; j<res[0].size(); ++j) {
res[0][j] += res[0][j - 1];
}
for (int j = 1; j<res.size(); ++j) {
res[j][0] += res[j - 1][0];
}
for (i = 1; i<res.size(); ++i) {
for (int j = 1; j<res[i].size(); ++j) {
res[i][j] = min(res[i - 1][j], res[i][j - 1]) + grid[i][j];
}
}
return res[grid.size() - 1][grid[0].size() - 1];
}