动态规划
class Solution {public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {if (obstacleGrid.size() ==0 || obstacleGrid[0][0] == 1) return 0;int row = obstacleGrid.size();int col = obstacleGrid[0].size();vector<vector<int>> dp(row, vector<int>(col, 0));for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {if (obstacleGrid[i][j] == 1) {dp[i][j] = 0;continue;}if (i == 0 && j == 0) dp[i][j] = 1;else if (i == 0) dp[i][j] = dp[i][j-1]; //注意初始化边界的时候,一定不能直接写成1,因为边界上可能存在障碍物!!!else if (j == 0) dp[i][j] = dp[i-1][j];else dp[i][j] = dp[i-1][j] + dp[i][j-1];}}return dp[row-1][col-1];}};-- 优化:将dp数组多初始化一行一列。这样可以不用初始化dp首行和首列,直接调用dp方程即可;此时要注意obstacleGrid 中的i,j判断是要减1,因为比dp数组少一行一列class Solution {public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int row = obstacleGrid.size();int col = obstacleGrid[0].size();vector<vector<int>> dp(row + 1, vector<int>(col + 1, 0));dp[0][1] = 1; //dp[1][0] 也可以for (int i = 1; i <= row; ++i) {for (int j = 1; j <= col; ++j) {if (obstacleGrid[i-1][j-1] == 0)dp[i][j] = dp[i-1][j] + dp[i][j-1];}}return dp[row][col];}};
