二次元アレイの最短経路

件名の説明:

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];
    }
};
公開された97元の記事 ウォン称賛13 ビュー20000 +

おすすめ

転載: blog.csdn.net/weixin_44030580/article/details/105051491