一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?
动态规划:
1: 确定dp数组以及下标的含义: dp[i][j] 从(0,0) 出发,到(i,j)有dp[i][j]条路径
2:确定递推公式:想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j](左) 和 dp[i][j - 1]。(上)dp[i - 1][j] 表示啥,是从(0, 0)的位置到(i - 1, j)有几条路径 dp[i][j - 1] 表示啥,是从(0, 0)的位置到(i , j- 1)有几条路径 所以dp[i ][j]就是 dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来
3:dp数组初始化:第一行和第一列都为1,因为路径只有这一条 dp[i][0] 和 dp[0][j]
4:确定递归顺序:dp[i - 1][j] + dp[i][j - 1]
5 推导递归数组:
/**
* 1. 确定dp数组下标含义 dp[i][j] 到每一个坐标可能的路径种类
* 2. 递推公式 dp[i][j] = dp[i-1][j] dp[i][j-1]
* 3. 初始化 dp[i][0]=1 dp[0][i]=1 初始化横竖就可
* 4. 遍历顺序 一行一行遍历
* 5. 推导结果 。。。。。。。。
*
* @param m
* @param n
* @return
*/
class Solution {
public int uniquePaths(int m, int n) {
int[][] dp= new int[m][n];
for(int i = 0;i < m; i++){
dp[i][0] = 1;
}
for(int i = 0; i < n; i++){
dp[0][i] = 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-1][n-1];
}
}
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1 和 0 来表示。
上一题介绍了没有障碍的路径数,如果有障碍的话,那么dp就应该保持最初始状态
动态规划:
1 确定dp数组: dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。
2:确定递推公式:dp[i ][j]就是 dp[i - 1][j] + dp[i][j - 1],如果没障碍继续增加
3 :dp初始化:我们要考虑遇到障碍的问题,所以如果障碍存在那么直接终止,否则赋值为1
4:确定遍历顺序:
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (obstacleGrid[i][j] == 1) continue;
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
java 在声明了一个数组,并为其分配好存储空间后,未赋值之前会默认对其初始化:
整形数组 默认初始值为0;
布尔数组默认初始值为 false;
String 数组以及 对象数组初始值为 null.
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int n = obstacleGrid.length;
int m = obstacleGrid[0].length;
int[][] dp = new int [n][m];
for(int i = 0; i < m; i++){
if(obstacleGrid[0][i] == 1) break;
dp[0][i] = 1;
}
for(int i = 0; i < n; i++){
if(obstacleGrid[i][0] == 1) break;
dp[i][0] = 1;
}
for(int i = 1; i < n; i++){
for(int j = 1; j < m; j++){
if(obstacleGrid[i][j] == 1){
continue;
}
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[n-1][m-1];
}
}