题目
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.
大意就是:给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
分析
这道题属于动态规划分类,所以我们使用动态规划可以很快的解决这道题
我们可以很容易的发现(i, j)
的最短路径是从(i-1, j)
到(i, j)
和(i, j-1)
到(i, j)
这两条路径中较短的那条,这样我们就可以很容易得到我们的代码了
代码
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size();
int n = grid[0].size();
int arr[m][n];
arr[0][0] = grid[0][0];
for (int i = 1; i < n; ++i) {
arr[0][i] = arr[0][i - 1] + grid[0][i];
}
for (int i = 1; i < m; ++i) {
arr[i][0] = arr[i-1][0] + grid[i][0];
}
for (int i = 1; i < m; ++i) {
for (int j = 1; j < n; ++j) {
if(arr[i-1][j] < arr[i][j-1]) {
arr[i][j] = arr[i-1][j] + grid[i][j];
}
else {
arr[i][j] = arr[i][j-1] + grid[i][j];
}
}
}
return arr[m-1][n-1];
}