みなさん、こんにちは。私は「@不飞的小飞驴」です。
5
ロボットが終点に到達するためのさまざまなパスロボットは、mxnグリッドの左上隅にあります(始点は、下の図で「開始」とマークされています)。
ロボットは一度に1ステップ下または右にしか移動できません。ロボットはグリッドの右下隅に到達しようとします(下の画像で「完了」とマークされています)。
合計でいくつの異なるパスがありますか?
例1:
入力:m = 3、n = 7
出力:28
例2:
入力:m = 3、n = 2
出力:3
説明:
左上隅から始めて、右下隅までの合計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];
}