説明
左コーナーMXNグリッドに位置ロボットは(以下、「スタート」と表示されたポイントのフィギュアを開始します)。
ロボットは右または下に一歩を移動することができます。(「完了」と表示され、次の図の)グリッドの右下隅に到達しようとしているロボット。
合計でQ.どのように多くの異なるパスがありますか?
例えば、マップは7×3のグリッドです。どのように多くの可能なパスを持っていますか?
説明:M及びnの値以上100以下です。
例1:
入力:M = 3、N = 2
出力:3
説明:
左上隅、右下隅に3つの経路の合計。
1.右- >右- >ダウン
2.右- >下- >右
3.ダウン- >右- >右
例2:
入力:M = 7、n = 3の
出力:28
解決
これは、DPアルゴリズムは明らかです。上側の左下隅のパスのパス番号+番号の左側に右下隅:右下隅に到達するパスの数は、2つの部分を有します。
即DP [M] [N] = DP [M] [N - 1] + DP [M - 1] [n]は(M行N列)。
境界値は、最初の行、最初の列は、移動の一種のみから、1です。
コード
公共 INT uniquePaths(INT M、INT N){ 場合(M <= 0 || N <= 0 ){ 戻り 0 。 } INT [] []配列= 新しい INT [M] [N]。 以下のために(INT ; I <M; iが0 = I ++ ){ アレイ[I] [ 0] = 1 ; } のための(INT ; I <N I ++ iが0 = {) アレイ[ 0] [I] = 1 。 } のための(INT II <M; = 1 II II ++){ ため(INT KK = 1; KK <N; KK ++ ){ アレイ[II] [KK] =配列[II - 1] [KK] +配列[II] [KK - 1 ]。 } } 戻り配列[M - 1] [N - 1 ]。 }
最適化:(もっと正規図面に移動する)Discoverを描画した後、実際には、それぞれが現在および以前のラインでのみ計算されます。二次元アレイは、一次元配列に変換することができます。
DP [M] [N] = DP [M] [N - 1] + DP [M - 1] [n]を、変更することができるDP [I] = DP [I] + DP [I - 1]
パブリック 静的 INT uniquePaths1(INT M、INT N){ 場合(M <= 0 || N <= 0 ){ 戻り 0 。 } INT [] DP = 新しい INT [N]。// 用列初始化 // 初始化 ため(INT iが= 0、I <N; I ++ ){ DP [I] = 1 。 } // 公式:DP [I] = DP [I-1] + DP [I] のための(INT ; I <M I ++ iは1 = {) DP [ 0] = 1; //0の初期値であるi番目の行 のための(INT J = 1; J <N- J ++。{) DP [J] = DP [J - 1] + DP [J]; } } 戻り [N-- 1 DP ]。 }