ロボットは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 ; for(int i = 1 ; i <= m- 1 ; i ++ ) { temp * = i; } for(int i = n; i <= m + n- 2 ; i ++ ) { 結果 * = i; } 結果 =結果/ 一時; 結果を返す; } };
アイデア:帰納的方法、各ノードは左または上からのみ来ることができます。パスの数=左隣+上隣
クラスSolution { public : int uniquePaths(int m、int n){ // [1]归纳法 vector <vector < int >> vvec(m); for(int i = 0 ; i <m; i ++ ){ vector < int > vec(n); vvec [i] = vec; for(int 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 ]; } };