m×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%的用户