
状态定义:dp[i][j] 表示到达 (i,j)处的不同路径总数.
问题目标:dp[n][m]
状态转移:由于每次只能往右或往下移动,那么 dp[i][j] 必然与 dp[i-1][j] (注:(i-1,j)往下走一步到(i,j)) 和 dp[i][j - 1]有关,又由于题目对路径的格子加了约束(有些格子不能访问),那么有 dp[i][j] = 当前格子是否有障碍物 ? dp[i-1][j] + dp[i][j-1] : 0
状态初始化:dp[1][1] = 1,且 dp 中第一行、第一列在未遇到障碍物前均设置为1,障碍物及障碍物以后的位置均为0
时间复杂度:O(m * n)
空间复杂度:O(m * n) ——可优化
class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m = obstacleGrid.length;int n = obstacleGrid[0].length;int[][] dp = new int[m + 1][n + 1];//dp初始化for(int i = 1; i <= n; i++){if(obstacleGrid[0][i-1] == 1){ //如果遇到障碍物,说明后面的列过不去了break;}dp[1][i] = 1;}for(int i = 1; i <= m; i++){if(obstacleGrid[i-1][0] == 1){ //如果遇到了障碍物,说明后面的行过不去了break;}dp[i][1] = 1;}for(int i = 2; i <= m; i++){for(int j = 2; j <= n; j++){if(obstacleGrid[i-1][j-1] == 1){continue;}dp[i][j] = dp[i-1][j] + dp[i][j-1];}}return dp[m][n];}}
