プロ62異なるパス
件名の説明:
MXNグリッドの左上隅にあるロボット
ロボットは右または下に一歩を移動することができます。ロボットは、グリッドの右下隅に到達しよう
Q.合計でありますどのように多くの異なるパス?
問題解決のアイデア:
1。
これは、最も明白な主題組合せ装置は、ダウンするステップ数が固定されている右、左上と右下の隅から来ているように選択されたn(M-1)+(N -1) 工程における(右、これにM-1ステップを選択することができるように)-1問題の組み合わせの下部デッキに向かって移動します。このように、異なるパスの総数。
コードは以下の通りであります:
// 置換方法は、ステップを残しM + N-2の合計として理解することができ、M-1選択下部デッキに向かって移動する、請求 //がオーバーフローするときM、N大きな原因となる二重使用、 公共 INT(uniquePathsをint型 Mを、INT N-) { ダブル結果=階乗(N-M-2 + ,.)-N - 1 /階乗(M-1,0 ); // のSystem.out.println(結果); リターン(INT )結果; } // 階乗機能 公共 ダブル階乗(int型 [スタート]、int型エンド){ ダブル RESが= 1。; 用(ダブル I =スタート; I> END; i-- ){ RES= RES * I。 } 戻りRESと、 }
2。
第二の考え方はすべての位置に、動的プログラミングアルゴリズムであり、それは上記の点でダウンステップを取るか、右にさらに一歩進み、左を指します。最初の列の最初の行と全ての点が到達するための唯一の経路を有しています。
すべては、以下を達成するために:
// n行m列、すなわちM×n個のグリッド // すべてのパス位置に来るは、[i] [j]は、位置への完全なパスに等しい[I-1] [j]のプラス位置[I] [J-1]すべてのパス パブリック INT uniquePaths1(INT M、INT N-){ INT [] [] =パス新しい新しい INT [N-] [M]; // 最初の行 のための(INT ; iがmを<; I = 0 I ++の)パス[ 0] [I] = 1 ; // 最初のカラム のための(INT J = 0; J <N-; J ++)パス[J] [0] = 1 ; のための(INT I = 1; iがmを<; I ++は){ 用(INT J = 1; J <N-; J ++ ){ パス[J] [I] =パス[J] [I-1] +パス[J-1 ] [i]は、 } } リターンパス[N-1] [M-1 ]。 }
Pro63。異なるパス||
件名の説明:
62と同様の質問は、単にグリッドに多くの障害物を支払います。入力は、グリッドを表現する二次元アレイ、それぞれ障害物と空のグリッド位置である 1
と 0
示されます。
今すぐグリッドの障害物を考慮してください。だから、どのように多くの異なるパス左上から右下にあるでしょうか?
問題解決のアイデア:
位置が障害である場合障害物の場合には、ポイントが0に設定されたすべてのポイントに到達するために、パスの数に到達できません。障壁のためにグリッドがある場合に加えて、1行1列目の初期化中に、次に、グリッドの右側/底に到達しています。
コードの実装:
公共 INT uniquePathsWithObstacles(INT [] [] obstacleGrid){ // 若数组为空 であれば(obstacleGrid.length == 0)戻り 0 ; int型のlen = obstacleGrid.length。 INT WID = obstacleGrid [0 ] .LENGTH。 値int [] []パスは= 新しい INT [LEN] [WID]。 // 第一列 のための(int型 i = 0; iがLEN <; iは++ ){ 場合(obstacleGrid [I] [0] == 1)破ります。 経路[I] [ 0] = 1 。 } //最初の行 のための(INT J = 0; J <WID; J ++ ){ IF(obstacleGrid [0] [J] == 1)BREAK ; パス[ 0] [J] = 1 ; } のための(INT I = 1。 IがLEN <; I ++は){ ため(INT J = 1; J <WID; J ++ ){ // 障害のポイントは、ポイントは、パスの数が0に達した場合 IF(obstacleGrid [I] [J] == 1 )パス[I] [J] = 0 ; 他{ パス[I] [J] =パス[1-I]、[J] +パス[I]、[J-1 ]; } } } 戻り経路[lenの-1] [widの-1 ]。 }