住所:HTTPS://leetcode-cn.com/problems/unique-paths/
方法の一つ:動的計画
-
ステータス:
dp[i][j]
表す座標歩いた(i, j)
パスの総数。 -
状態遷移方程式:アイデアは、分類された議論は座標が入ったままで
(i, j)
トップダウンから得ることができる、あなたはまた、左から来ることができる、それは2つのパスの合計です。
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
-
初期化:アレイ
dp
の行1列1は、1の値を表示していました。 -
出力:
dp[m - 1][n - 1]
。 -
圧縮の状態:あなたは、配列をスクロールすることができますまた、単に一次元に圧縮することができます。
Javaコード:
import java.util.Arrays;
public class Solution {
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
Arrays.fill(dp[0], 1);
for (int i = 1; i < m; i++) {
dp[i][0] = 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];
}
}
初期あまりにも面倒、それは「センチネル」書き込み、配列と考えることができdp
、書き込みライン、書き込み1。
Javaコード:
import java.util.Arrays;
public class Solution {
public int uniquePaths(int m, int n) {
int[][] dp = new int[m + 1][n + 1];
// 初始化的时候 dp[0][1] = 1; 或者 dp[1][0] = 1; 均可
dp[1][0] = 1;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
dp[i + 1][j + 1] = dp[i][j + 1] + dp[i + 1][j];
}
}
return dp[m][n];
}
}
圧縮の状態。
Javaコード:
public class Solution {
public int uniquePaths(int m, int n) {
int[] dp = new int[n];
dp[0] = 1;
for (int i = 0; i < m; i++) {
for (int j = 1; j < n; j++) {
dp[j] += dp[j - 1];
}
}
return dp[n - 1];
}
}
方法2:組み合わせの数
、座標行きまし解決するための組み合わせの数を使って(m, n)
歩く、場所のをm - 1
右に移動し、グリッドをn - 1
フォーマット。私たちは、総歩いm + n - 2
グリッドを。