给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小。
思路:今天的目标就是刷完动态规划。冲鸭!!!也得一道典型的动态规划题,对于这种难度的动态规划题,只要在牢记记住子求解的答案,并且注意边界条件,和边界特殊情况就可以了。这道理求经过路径最小,就是求每一步的最小路径是什么,对于最后一个点的路径最小肯定是它的上面或者是左面经过的最小路径加上它本身数值,每一个都是如此。依次类推。计算出每一点的最小路径,直至达到我们需要的位置。
c++代码如下:
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int right=0; //向右走了几步
int down=0; //向下走了几步
int n=grid.size();
int m=grid[0].size();
vector<vector<int>> sum(n,vector<int>(m,-1));
// sum[0]=grid[0]; //这种写法可以吗
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(i==0 && j==0) sum[0][0]=grid[0][0];
else if(i == 0) sum[i][j]=grid[i][j]+sum[i][j-1];
else if(j == 0) sum[i][j]=sum[i-1][j]+grid[i][j];
else{
sum[i][j]=min(sum[i-1][j],sum[i][j-1])+grid[i][j];
}
}
}
return sum[n-1][m-1];
}
};