目录
1. 不同路径
1.1 算法原理
- 状态表示dp[i][j]:走到(i,j)位置,一共有多少种方法(以(i,j)位置为结尾)
- 状态转移方程:dp[i][j]=dp[i-1][j]+dp[i][j-1];
- 初始化:dp[0][1]=1;
- 建表顺序:从上往下的每一行填表,每一行中从左往右。
- 返回值:dp[m][n]
1.2 算法代码
class Solution {
//1.创建dp表
//2.初始化
//3.填表顺序
//4.返回值
public int uniquePaths(int m, int n) {
int[][] dp = new int[m + 1][n + 1];
//初始化
dp[0][1] = 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];
}
}
return dp[m][n];
}
}
2. 不同路径 II
2.1 算法原理
本题算法思想和上题基本一致,但需额外注意以下几点:
- dp填表时,需要注意当前位置(i,j)是否存在障碍物,若存在障碍物则dp[i][j]=0;
- 初始化后,虚拟节点值的设置与上题相同。但,由于本题是数组形式,所以需要额外注意原数组与dp表的下标映射关系。
2.2 算法代码
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
//以(i,j)位置为终点,到达(i,j)位置的路径总数
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
int[][] dp = new int[m + 1][n + 1];
dp[0][1] = 1;
for(int i = 1; i <= m; i++) {
for(int j = 1; j <= n; j++) {
if(obstacleGrid[i - 1][j - 1] != 1)
dp[i][j] = dp[i -