Lituo-62 の異なるパス
1. トピック
ロボットは、mxn グリッドの左上隅に配置されます (下図では開始点に「開始」とマークされています)。
ロボットは一度に1 ステップ下または右へのみ移動できます。ロボットはグリッドの右下隅 (下の画像で「終了」とマークされている) に到達しようとします。
異なるパスは合計で何通りありますか?
例:
输入:m = 3, n = 7
输出:28
2. 分析
- まず、タイトルに必要なものを見てください
总共有多少不同的路径
。総和問題であることがわかります - 次に、グリッドの 1 つにある場合、このグリッドへのパスの総数を計算する方法を分析します。質問の意味によれば、ロボットは毎回下方向または右方向にしか増加できません。これは、前のパス (つまりサブパス) を含む合計と累積のプロセスであり、典型的な動的計画法の問題です。
- 図からわかるように、これは2 次元配列であるため、dp[i][j] の値の意味、つまり、このグリッドへのさまざまなパスの合計数を定義する必要があります。
- 次に、どのような状態遷移方程式が必要か、プロセスをシミュレーションします。
- 初期値を定義する
- 最後にコードを書き出します
3. コードとコメント
class Solution {
public int uniquePaths(int m, int n) {
// 1.dp[i][j] 表示到第i行j列时路径的总数
int[][] dp = new int[m][n];
// 2.初始化第一行和第一列,因为在模拟过程,发现第一行和第一列格子只有一种走法
for (int i = 0; i < n; i++){
dp[0][i] = 1;
}
for (int j = 0; j < m; j++){
dp[j][0] = 1;
}
// 3.使用状态转移方程,中间的格子,只能由上面和左边过来
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];
}
}
// 4.返回我们最后到的格子所不同路径总合
return dp[m - 1][n - 1];
}
}
4. 練習する
Leetcode リンク: https://leetcode.cn/problems/unique-paths/