版权声明:本文为博主原创文章,如需转载,请注明出处: https://blog.csdn.net/MASILEJFOAISEGJIAE/article/details/89766244
题目描述
一个棋盘有n行m列,从棋盘的左上角走到右下角,每次只能往右走一步,或者往下走一步,每个格子都有一个数字,求怎样走才能使走过的数字总和最小。
举例
Input:
[ [1,3,1],
[1,5,1],
[4,2,1] ]
Output: 7
(因为路径1->3->1->1->1能求得最小的总和7)
解题思路
这道题是典型的动态规划问题,是问题动态规划:走棋盘的变种。
#include <vector>
class Solution
{
public:
int min(const int &a, const int &b)
{
return a < b ? a : b;
}
int minPathSum(vector<vector<int>> &grid)
{
int n = grid.size(); //行
int m = grid[0].size(); //列
int s[200][200];
s[0][0] = grid[0][0];
//填充第一列
for (int i = 1; i < n; i++)
{
s[i][0] = s[i - 1][0] + grid[i][0];
}
//填充第一行
for (int j = 1; j < m; j++)
{
s[0][j] = s[0][j - 1] + grid[0][j];
}
for (int i = 1; i < n; i++)
{
for (int j = 1; j < m; j++)
{
s[i][j] = min(s[i - 1][j], s[i][j - 1]) + grid[i][j];
}
}
return s[n - 1][m - 1];
}
};
LeetCode链接:LeetCode 64. Minimum Path Sum