leetcode_22【動的計画】----異なるパス

ロボットはmxnグリッドの左上隅にあり  ます下図 では、開始点には「開始」というラベルが付いています)。

ロボットは、一度に1ステップ下または右にしか移動できません。ロボットはグリッドの右下隅に到達しようとします(下の画像では「完了」とマークされています)。

合計でいくつの異なるパスがありますか?

たとえば、上の画像は7 x 3グリッドです。可能なパスはいくつありますか?

 

例1:

入力:m = 3、n = 2 
出力:3 
説明:
左上隅から開始して、右下隅に到達できる合計3つのパスがあります。
1. 
右→右→下2.右→下→右
3.下→右→右

例2:

入力:m = 7、n = 3 
出力:28

 

ヒント:

  • 1 <= m, n <= 100
  • 回答が以下かどうかを確認するための質問データ 2 * 10 ^ 9

回答(C ++):

アイデア: m + nでn個のパスを見つける、数学的な組み合わせ問題C(m + n、n)

クラスSolution {
 public int uniquePaths(int m、int n){
         // [0]数学:(m-1 + n-1)m-1 
        if(m == 1 || n == 1 return  1 ;
         if(m> n)
            swap(m、n); // m <= n 
        unsigned long  long  int temp = 1 ; 
        unsigned long  long  int result = 1 ;
         forint i = 1 ; i <= m- 1 ; i ++ 
        { 
            temp * = i; 
        } 
        forint i = n; i <= m + n- 2 ; i ++ 
        { 
            結果 * = i; 
        } 
        結果 =結果/ 一時;
        結果を返す; 
    } 
};

アイデア:帰納的方法、各ノードは左または上からのみ来ることができます。パスの数=左隣+上隣

クラスSolution {
 public int uniquePaths(int m、int n){
         // [1]归纳法 
        vector <vector < int >> vvec(m);
        forint i = 0 ; i <m; i ++ ){ 
            vector < int > vec(n); 
            vvec [i] = vec;
            forint j = 0 ; j <n; j ++ ){
                 if(i == 0 || j == 0){ 
                    vvec [i] [j] = 1 ; 
                } else { 
                    vvec [i] [j] = vvec [i- 1 ] [j] + vvec [i] [j- 1 ]; 
                } 
            } 
        } 
        return vvec [m- 1 ] [n- 1 ]; 
    } 
};

 

おすすめ

転載: www.cnblogs.com/vczf/p/12735964.html