比较直接的二维矩阵DP 问题。在每个节点的状态转移公式为dp[i][j] = dp[i-1][j] + dp[i][j-1]。需判断边界。
class Solution {
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
//dp[i][j] = dp[i-1][j] + dp[i][j-1];
dp[0][0] = 1;
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(i==0 && j==0) {
continue;
}
int left = 0;
int up = 0;
if(i>=1) {
up = dp[i-1][j];
}
if(j>=1) {
left = dp[i][j-1];
}
dp[i][j] = up + left;
}
}
return dp[m-1][n-1];
}
}
63. Unique Paths II 加上障碍的矩阵DP问题。 要注意起始节点和终点也可以是障碍物,这样就直接没路径了。
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int row = obstacleGrid.length;
int col = obstacleGrid[0].length;
int dp[][] = new int[row][col];
if(obstacleGrid[0][0] == 1) {
return 0;
}
dp[0][0] = 1;
for(int i=0; i<row; i++) {
for(int j=0; j<col; j++) {
if(i==0 && j==0) {
continue;
}
int updp = 0;
int leftdp = 0;
if(i>0 && obstacleGrid[i-1][j] != 1) {
updp = dp[i-1][j];
}
if(j>0 && obstacleGrid[i][j-1] != 1) {
leftdp = dp[i][j-1];
}
dp[i][j] = updp + leftdp;
if(obstacleGrid[i][j] == 1) {
dp[i][j] = 0;
}
}
}
return dp[row-1][col-1];
}
}