首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

LeetCode 62:不同路徑——動態規劃與空間優化

     編輯:關於C++

題目描述

機器人從 m×n 網格左上角走到右下角,每步只能向右或向下,求不同路徑總數。m,n ≤ 100。

DP 狀態定義

dp[i][j] 表示到達 (i,j) 的路徑數。轉移方程:

dp[i][j] = dp[i-1][j] + dp[i][j-1]

邊界:第一行、第一列全為 1。

二維 DP 實現

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];
}

數學組合解法 O(min(m,n))

本質是從 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;

複雜度對比

方法時間空間
二維 DPO(mn)O(mn)
一維 DPO(mn)O(n)
組合數學O(min(m,n))O(1)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved