前言
之前入门算法用代码随想录(代码随想录),将递归,动态规划这些都学了一遍,也自己动手实现过,但之前也是边参考边写出来的,而且隔了有一段时间了,最近二刷一次!!这次挑战尽量自己写出来。
题目
一个机器人位于一个 m x n
网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1
和 0
来表示。
代码
public class _4_63_不同路径 {
public static void main(String[] args) {
System.out.println(uniquePathsWithObstacles(new int[][]{{0, 0, 0}, {0, 1, 0}, {0, 0, 0}}));
}
public static int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
//dp :走到(i,j)的位置一共有dp[i][j]种方法
int[][] dp = new int[m][n];
//初始化 ,考虑有障碍物的情况
for(int i = 0 ; i < m; i++){
if(obstacleGrid[i][0] == 1){
break;
}else{
dp[i][0] = 1;
}
}
for(int i = 0 ; i < n; i++){
if(obstacleGrid[0][i] == 1){
break;
}else{
dp[0][i] = 1;
}
}
for(int i = 1; i < m ; i ++){
for(int j = 1; j < n ; j++){
if(obstacleGrid[i][j] == 0){
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}
}