Leetcode---63. 不同路徑 II---每日一題---動態規劃

63. 不同路徑 II

一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記爲“Start” )。

機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記爲“Finish”)。

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

在這裏插入圖片描述

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

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

示例 1:

輸入:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
輸出: 2
解釋:
3x3 網格的正中間有一個障礙物。
從左上角到右下角一共有 2 條不同的路徑:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

思路

       一開始的思路當然是DFS或者BFS隨便跑一下,然後沒跑過,那就DP吧,和傳紙條一個類型的題目,就是列個狀態轉移方程dp[i][j] = dp[i - 1][j] + dp[i][j - 1],對於開始的特殊兩個點有很多處理方法,不知道怎麼處理的可以看看我這裏的寫法。

實現代碼

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