62.不同路径
思路:动态规划五步曲
- dp[i][j]代表到达第ij个位置有多少条路径
- 递推公式:dp[i][j] = dp[i][j - 1] + dp[i - 1][j],因为dp[i][j]只能够从这两个方向走过来。
- 初始化第一行和第一列为1
- 根据递推公式可以看出,需要从左到右按行进行遍历
- 举例证明
class Solution {
public int uniquePaths(int m, int n) {
// dp[i][j]代表到达第ij个位置有多少条路径
int[][] dp = new int[m][n];
// 递推公式:dp[i][j] = dp[i][j - 1] + dp[i - 1][j]
// 初始化第一行和第一列为1
for (int i = 0; i < dp.length; i++) {
dp[i][0] = 1;
}
for (int j = 0; j < dp[0].length; j++) {
dp[0][j] = 1;
}
// 按行进行遍历
for (int i = 1; i < dp.length; i++) {
for (int j = 1; j < dp[i].length; j++) {
dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
}
}
return dp[m - 1][n - 1];
}
}
63. 不同路径 II
思路:动态规划五步曲
- dp[i][j]代表到达第ij个位置有多少条路径
- 递推公式:dp[i][j] = dp[i][j - 1] + dp[i - 1][j],因为dp[i][j]只能够从这两个方向走过来。
- 初始化第一行和第一列为1,但是如果遇到障碍则后面的全为0
- 同样是从左到右按行进行遍历,如果当前位置有障碍物,则不对其进行赋值。
- 举例证明
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
// dp[i][j]代表到达第ij个位置有多少条路径
int[][] dp = new int[obstacleGrid.length][obstacleGrid[0].length];
// 递推公式:dp[i][j] = dp[i][j - 1] + dp[i - 1][dp]
// 初始化第一行和第一列为1,如果遇到障碍则后面的全为0
for (int i = 0; i < dp.length; i++) {
if (obstacleGrid[i][0] == 1) break;
dp[i][0] = 1;
}
for (int j = 0; j < dp[0].length; j++) {
if (obstacleGrid[0][j] == 1) break;
dp[0][j] = 1;
}
// 按行进行遍历
for (int i = 1; i < dp.length; i++) {
for (int j = 1; j < dp[i].length; j++) {
if (obstacleGrid[i][j] == 1) continue;
dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
}
}
return dp[dp.length - 1][dp[0].length - 1];
}
}