今日のトピックは、LeetCodeブラシで62件の質問、質問は次のとおりです。
左コーナーMXNグリッドに位置ロボットは(以下、「スタート」と表示されたポイントのフィギュアを開始します)。
ロボットは右または下に一歩を移動することができます。(「完了」と表示され、次の図の)グリッドの右下隅に到達しようとしているロボット。
Q.合計でありますどのように多くの異なるパス?
この質問は、私が最初に考えたのアルゴリズムを非常にシンプルなバックトラックましたが、次のように残業、特別のコードは次のとおりです。
プライベート 静的 int型は数えます。 パブリック 静的 int型の溶液(int型 M、int型N){ カウント = 0 ; 再帰(M、N、 0,0 )。 戻り値の数。 } パブリック 静的 ボイド再帰(INT M、整数 nは、INTのx、int型のY){ 場合(X == M-1 &&のy == N-1 ){ カウント ++ 。 返します。 } 場合(X <M){ 再帰(M、N、X 1 、Y)。 } であれば(Y < N){ 再帰(M、N、X、Y +1 )。 } }
その後、アカウントに文を取り、唯一のX-1YとXY-1の二点からポイントXYに到達することができ、あなたは、動的プログラミングを行うことができます。具体的には、コードは以下の
パブリック 静的 INT DP(INT M、int型N){ INT [] [] DP = 新しい INT [M] [N]。 以下のために(int型、iがm <; I = 0 iは++ ){ DPを[I] [ 0] = 1 ; } のために(int型 i = 0; iがn <; iは++ ){ DP [ 0] [I] = 1 。 } のための(int型 i = 1; iが<M; iが++ ){ ため(INT J = 1; J <nであり、j ++ ){ DP [I] [J]= DP [I-1]〜[J] + DP [I]、[J-1 ]。 } } 戻り DP [M-1]〜[N-1 ]。 }
しかし、あまりにもスペースの上の2次元配列は、さらに圧縮することができます。この行に移動した行番号に直接想像し、その後、XYの値は、単にXY-1の値を追加する必要があります。次のように具体的コードは:
パブリック 静的 int型 DP2(INT M、INT N){ int型 []現行= 新しい INT [n]を、 Arrays.fill(現在、 1 )。 以下のために(int型 i = 1; iがm <; iは++ ){ ための(int型、J = 1、J <nであり、j ++ ){ 現在[J] + =現在[J-1 ]。 } } 戻り電流[N-1 ]。 }