版权声明: https://blog.csdn.net/dickdick111/article/details/84892456
题目链接:64. Minimum Path Sum
题目大意:给出一个矩阵,现在想寻求一条从最左上元素到达最右下的最短路径,且只能向下走或者向右走两种途径。
一.算法设计
这也是一道典型的动态规划题目,我设计状态为sum[ i ][ j ] 表示为第i行第j列到达该点的最短长度。现在想求sum[row - 1][col -1]的值。
状态转移方程:
- 向右走: sum[i][j] = sum[i-1][j] + grid[i][j]
- 向下走:sum[i][j] = sum[i][j-1] + grid[i][j]
最后sum[i][j]取上述两值的最小值即可,这样的算法复杂度为O(M*N)
注意点:
- 注意初始化第一个位置的距离,即sum[0][0]
- 注意判断是否越界
- 初始化temp的值,不然取最小值的时候会出现错误,变为0.
二.算法实现
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int col = grid[0].size();
int row = grid.size();
int sum[row][col] = {0};
sum[0][0] = grid[0][0];
for(int i = 0; i < row; i ++){
for(int j = 0; j < col; j++){
if(i == 0 && j == 0) continue;
int temp1 = 999,temp2 = 999;
// right
if(i-1 >= 0)
temp1 = sum[i-1][j] + grid[i][j];
// bottom
if(j-1 >= 0)
temp2 = sum[i][j-1] + grid[i][j];
sum[i][j] = min (temp1,temp2);
}
}
return sum[row-1][col-1];
}
};