機器人從 m×n 網格左上角走到右下角,每步只能向右或向下,求不同路徑總數。m,n ≤ 100。
dp[i][j] 表示到達 (i,j) 的路徑數。轉移方程:
dp[i][j] = dp[i-1][j] + dp[i][j-1]
邊界:第一行、第一列全為 1。
int uniquePaths(int m, int n) {
vector<vector<int>> dp(m, vector<int>(n, 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];
}
第 i 行只依賴第 i-1 行(同數組上一值)和當前行左側(數組前一值):
int uniquePaths(int m, int n) {
vector<int> dp(n, 1);
for (int i = 1; i < m; ++i)
for (int j = 1; j < n; ++j)
dp[j] += dp[j-1];
return dp[n-1];
}
本質是從 m+n-2 步中選 m-1 步向下(或 n-1 步向右):
C(m+n-2, m-1) = (m+n-2)! / ((m-1)! (n-1)!)
用 64 位整數迭代計算避免溢出:
long long ans = 1;
for (int i = 1; i <= m-1; ++i)
ans = ans * (n - 1 + i) / i;
| 方法 | 時間 | 空間 |
|---|---|---|
| 二維 DP | O(mn) | O(mn) |
| 一維 DP | O(mn) | O(n) |
| 組合數學 | O(min(m,n)) | O(1) |