件名の説明:
m×nのグリッドの非負整数与えられ、下左から右への経路を見つけるようにパスの最小数の合計。
注:あなたが唯一のダウンまたは右に一歩を移動することができます。
例:
入力:
[
[1,3,1]、
[1,5,1]、
[4,2,1]
]
出力:7
説明:最小和ためパス→1→1→3 1→ 1 における。
出典:滞在ボタン(LeetCode)
リンクします。https://leetcode-cn.com/problems/minimum-path-sum
アイデアの分析:
分析の後、あなたは、これが典型的であることがわかります**
ダイナミックプログラミング
私たちの手が行くのは本当に良い見つけなさい、
私たちが行くように、私たちが見つける前に、パスの長さの背後には、私たちに影響を与えることが正しい道を選択してください
思った私たちは、だから、またはそれを現在のパスの長さを保存し、それが次の道路に遭遇するたびに、最短が行うたびに保証するものではありません。最初の2最短1を比較して、選択??
動的計画法の一般的なので!!!
//考慮してください。場所は本当に悪いスタートを起動すると、誰がバックへの道方法を知っている
//コードは実際には同じですが、あなたはまた、原点から始めることができることを発見書かれている
ので、目的地に到達することが必要で、私たちは目的地から出て設定//
/ /私たちが取るすべてのステップは、現在の最大で保存され、
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];
}
};