【LeetCode] 62☆☆☆異なる経路(動的プログラミング)

どのように動的計画法の最適化

説明

左コーナー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 ]。
    }

 

おすすめ

転載: www.cnblogs.com/fanguangdexiaoyuer/p/11856683.html