给定一个包含非负整数的 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
完整代码
采用回溯的思想结果运行超时,一共61个测试用例,只通过了60个.
尽管想得到的剪枝都剪了,实在想不到如何来优化了。
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
if(grid.size() == 0)
return 0;
int res = INT_MAX;
path(grid, res, 0, 0, 0);
return res;
}
private:
void path(vector<vector<int>>& grid, int &res, int cur, int i, int j){
if(i == grid.size() - 1 && j == grid[0].size() - 1){
cur += grid[i][j];
if(cur < res)
res = cur;
return;
}
int temp;
temp = cur + grid[i][j];
//向下走
if(i + 1 < grid.size() && temp < res)
path(grid, res, temp, i + 1, j);
//向右走
if(j + 1 < grid[0].size() && temp < res)
path(grid, res, temp, i, j+1);
}
};
动态规划
其实这道题是典型的动态规划的题目,只怪回溯用的太熟悉了
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
if(grid.size() == 0)
return 0;
int res = INT_MAX;
path(grid, res, 0, 0, 0);
return res;
}
private:
void path(vector<vector<int>>& grid, int &res, int cur, int i, int j){
if(i == grid.size() - 1 && j == grid[0].size() - 1){
cur += grid[i][j];
if(cur < res)
res = cur;
return;
}
int temp;
temp = cur + grid[i][j];
//向下走
if(i + 1 < grid.size() && temp < res)
path(grid, res, temp, i + 1, j);
//向右走
if(j + 1 < grid[0].size() && temp < res)
path(grid, res, temp, i, j+1);
}
};
执行结果:通过
显示详情
执行用时 :12 ms, 在所有 C++ 提交中击败了57.07%的用户
内存消耗 :11 MB, 在所有 C++ 提交中击败了45.90%的用户
来源:CSDN
作者:qq_31672701
链接:https://blog.csdn.net/qq_31672701/article/details/103963858