Check-in für Algorithmusfragen Tag 39 – Dynamische Programmierung | 62. Verschiedene Pfade, 63. Verschiedene Pfade II

62. Verschiedene Wege – LeetCode

Status: AC.

Die schrittweise Analyse ist nicht schwierig. Achten Sie einfach auf die Initialisierung. Zeitkomplexität O(m*n), Raumkomplexität O(m*n)und nachfolgende eindimensionale Arrays können zur Komprimierung und Optimierung der Raumkomplexität verwendet werden (spätere Ergänzung). Der Code lautet wie folgt:

class Solution {
public:
    int uniquePaths(int m, int n) {
        // 含义:dp[m][n],表示(m, n)处的路径数
        // 转移公式:dp[m][n] = dp[m-1][n] + dp[m][n-1]
        // 初始化:dp[m+1][n+1] dp[0][i] = 0, dp[i][0] = 0, dp[0][1] = 1, dp[1][0] = 1
        // 遍历:二重循环i = 1, j = 1
        // dp[1][1] = 1 dp[1][2] = 1 dp[1][3] = 1 
        // dp[2][1] = 1 dp[2][2] = 2 dp[2][3] = 1 + 2 = 3
        // dp[3][2] = 2 + 1 = 3 dp[3][3] = dp[2][3] + dp[3][2] = 3 +3 = 6 
        vector<vector<int>> dp(m+1, vector<int>(n+1, 0));
        for(int i = 1; i < m+1; ++i){
            for(int j = 1; j < n+1; ++j){
                if(i == 1 || j == 1){
                    dp[i][j] = 1;
                }
            }
        }

        for(int i = 2; i < m+1; ++i){
            for(int j = 2; j < n+1; ++j){
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        return dp[m][n];
    }
};

63. Verschiedene Wege II – LeetCode

Status: Keine Klimaanlage, Klimaanlage nach Überprüfung des Problems.

Diese Frage fügt eine Beurteilungsbedingung basierend auf der vorherigen Frage hinzu. Es ist zu beachten, dass bei der Initialisierung der ersten Zeile und der ersten Spalte Hindernisse vorhanden sind und die folgenden Hindernisse 0 sind. Die Raum-Zeit-Komplexität ist dieselbe wie bei der vorherigen Frage, der Code lautet wie folgt:

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        if(obstacleGrid[0][0] == 1) return 0;
        // 和不同路径1的转移方程类似,但是要加入是否存在障碍物的判断
        int m = obstacleGrid.size(), n = obstacleGrid[0].size();
        vector<vector<int>> dp(m, vector<int>(n, 0));
        for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) dp[i][0] = 1;
        for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) dp[0][j] = 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];
                if(obstacleGrid[i][j] == 1){
                    dp[i][j] = 0;
                }
            }
        }
        return dp[m-1][n-1];
    }
};

 

おすすめ

転載: blog.csdn.net/qq_40395888/article/details/132381657