Minimum Path Sum
没错,机器人的问题还没有完!这一次我们是找权值最小的路径,问题意思是这样的:从最左上角位置走到最右下角位置,且只能向右或者向左移动,而且每个位置对应着一个权值,找出所有路径中权值和最小的一条路径的权值和。
其实仔细看的话,这和之前的题的解题思路相似,我的思路是开辟一个和原二维数组一样大的二维数组(取名叫做V)用于记录到达每个位置的权值的和的最小值,我们还是可以得出一条结论:
这样思路就很清晰了,所以我们可以直接给出代码了,代码中需要对一些细节部分做一些处理的,请仔细看!
class Solution {
public:
int minPathSum(vector<vector<int>>& grid)
{
if (grid.size() == 0 || grid[0].size() == 0)
{
return 0;
}
int x = grid.size();
int y = grid[0].size();
vector<vector<int>> V(x , vector<int>(y , 0));
//V[0][0]位置等于grid[0][0]
V[0][0] = grid[0][0];
for (int i = 1; i < y; ++i)
{//第一行的各位置之和等于他当前值grid[0][i]加上V[0][i-1],因为第一行只能向右
V[0][i] = grid[0][i]+V[0][i-1];
}
for (int i = 1; i < x; ++i)
{//第一列的各位置之和等于他当前值grid[i][0]加上V[i-1][0],因为第一行只能向下
V[i][0] = grid[i][0] + V[i - 1][0];
}
//根据V[i][j] = grid[i][j] + min(V[i-1][j],V[i][j-1]),来计算(i,j)位置的最小数字和
for (int i = 1; i < x; ++i)
{
for (int j = 1; j < y; ++j)
{
V[i][j] = grid[i][j] + min(V[i - 1][j], V[i][j - 1]);
}
}
return V[x - 1][y - 1];
}
};
结果如下: