题目描述:
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-path-sum
思路分析:
分析过后你就会发现这是典型的**
动态规划
拿到手发现还真不好走,
我们发现随着我们走,后边的路径长度可能会影响之前我们选好的路径
因此我们想了想,还是保存一下当前的路径长度,再每次遇到下一条路的话,比较一下,选取前两条中最短的一条,这不就保证每次都是最短的吗??
所以典型的动态规划!!!
//考虑: 原地出发还真不好出发,天知道后边的路怎么样
// 写完代码发现其实都一样,也可以从原点出发
//那么 我们从目的地出发,因为必须要到达目的地
//我们每走一步都保存一下当前的最优解
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
//考虑: 原地出发还真不好出发,天知道后边的路怎么样
int length = grid.size();
int width = grid[0].size();
if(length < 1 || width < 1)
return 0;
vector<vector <int>>vv;
vv.resize(length);
for(int i =0; i<length; ++i )
{
vv[i].resize(width);
}
vv[length-1][width -1 ] = grid[length-1][width-1];
//动态统计
//既然我们反着走,所以只能从右边或下边来
//1 处理下边界 下边界只能从 右边来
int j = width -1;
for(int i = length-2; i >= 0; --i)
{
vv[i][j] = grid[i][j] + vv[i+1][j];
}
//if(length == 1)
// return vv[0][0];
//2 处理右边界 右边界只能从下边界来
int i = length-1;
for(int j = width-2; j >= 0; --j)
{
vv[i][j] = grid[i][j] + vv[i][j+1];
}
//统计非边界
for(int i=length - 2; i >= 0; --i)
{
for(int j=width-2; j >= 0; --j)
{
vv[i][j] = grid[i][j] +
min(vv[i+1][j], vv[i][j+1] );
}
}
return vv[0][0];
}
};