プログラマーのアップグレードダグアイレベル5:ロボットが最後まで到達する方法はいくつありますか?

みなさん、こんにちは。私は「@不飞的小飞驴」です。

5
ロボットが終点に到達するためのさまざまなパスロボットは、mxnグリッドの左上隅にあります(始点は、下の図で「開始」とマークされています)。
ロボットは一度に1ステップ下または右にしか移動できません。ロボットはグリッドの右下隅に到達しようとします(下の画像で「完了」とマークされています)。
合計でいくつの異なるパスがありますか?

例1:
ここに画像の説明を挿入

入力:m = 3、n = 7
出力:28

例2:
入力:m = 3、n = 2
出力:3
説明:
左上隅から始めて、右下隅までの合計3つのパスがあります。

  1. 右->下->下
  2. 下->右->下
  3. 下->下->右

まず、良い方法を考えてください。以下のコメントへようこそ。

全体的な考え方:この質問で使用される主なアイデアは次のとおりです。動的計画法ソリューション。
ロボットは右下にしか移動できず、他の方向には移動できないことに注意してください。座標を示すためにdp [i] [j]を使用します( i、j)このグリッドにはいくつの異なるパスがあるので、最終的な答えはdp [m-1] [n-1]を見つけることです。
上または左からしか得られないため、漸化式は
dp [i] [j] = dp [i-1] [j] + dp [i] [j-1]です。

dp [i-1] [j]は、上からのパスの数を表します。
dp [i] [j-1]は、左からのパスの数を表します。
ここに画像の説明を挿入

では、境界条件は何ですか?Finishの最初の行の任意の位置にパスが1つしかない場合、同様に、Finishの最初の列の任意の位置にパスが1つしかないため、境界条件は最初の行と最初の列は両方とも1です。漸化式と境界条件が見つかったので、動的計画法のコードは次のとおりです。
プログラム:

public int uniquePaths(int m, int n) {
    
    
    int[][] dp = new int[m][n];
    //第一列都是1
    for (int i = 0; i < m; i++) {
    
    
        dp[i][0] = 1;
    }
    //第一行都是1
    for (int i = 0; i < n; i++) {
    
    
        dp[0][i] = 1;
    }

    //这里是递推公式
    for (int i = 1; i < m; i++)
        for (int j = 1; j < n; j++)
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
    return dp[m-1][n-1];
}

おすすめ

転載: blog.csdn.net/u014251610/article/details/113747805
おすすめ