【leetcode】63. 不同路徑 II(unique-paths-ii)(DP)[中等]

鏈接

https://leetcode-cn.com/problems/unique-paths-ii/

耗時

解題:3 h
題解:17 min

題意

一個機器人位於一個 m x n 網格的左上角。

機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角。

現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?

網格中的障礙物和空位置分別用 1 和 0 來表示。

說明:m 和 n 的值均不超過 100。

思路

剛開始想 dfs 或者 bfs 暴搜,寫了一發,T了,然後開始想剪枝優化,後來發現剪枝會漏掉一些情況,,,然後,就放棄了這種思路。

DP 可以做,dp[i][j] 表示從左上角到當前位置(i,j)有 dp[i][j] 條不同的路徑。由於機器人只有在沒有障礙物的時候才能向下或者向右移動一步,所以狀態轉移方程如下:
dp[i][j]={dp[i1][j]+dp[i][j1]  ((i,j))0  ((i,j))dp[i][j] = \begin{cases} dp[i-1][j] + dp[i][j-1] \ \ ((i,j)沒有障礙物)\\ 0 \ \ ((i,j)有障礙物) \end{cases}
細節:dp 數組左上留出一行一列,方便代碼編寫。初始化的時候全爲 0,只有網格左上的位置沒有障礙物時,dp[1][1] = 1。

時間複雜度:O(mn)O(mn)

AC代碼

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m = obstacleGrid.size();
        if(m == 0) return 0;
        int n = obstacleGrid[0].size();
        
        vector<vector<int>> dp(m+1, vector<int>(n+1, 0));
        
        if(obstacleGrid[0][0] == 0) dp[1][1] = 1;
        
        for(int i = 1; i <= m ; ++i) {
            for(int j = 1; j <= n; ++j) {
                if(obstacleGrid[i-1][j-1] == 1 || (i == 1 && j == 1)) continue;
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        return dp[m][n];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章