62. 不同路径
题目描述
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例1:
输入:m=3,n=7m = 3, n = 7m=3,n=7
输出:282828
示例2:
输入:m=3,n=2m = 3, n = 2m=3,n=2
输出:333
示例3:
输入:m=7,n=3m = 7, n = 3m=7,n=3
输出:282828
思路
本题运用动态规划解题。首先,先确定一个dp方程的含义。dp[i][j] = a代表的是,到达(i,j)有a条道路。而机器人只能向下或向右移动,那么此时,到达(i,j)有两种方法,一是从(i-1,j)向下,而是从(i,j-1)向右。所以,可得dp[i][j] = dp[i-1][j]+dp[i][j-1]。
此外,需要注意的是,首行和首列只能从一个方向来,所以,其在dp数组中的值应均为1。
题解
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 j = 0;j<n;j++){
dp[0][j] = 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];
}
}
总结
本题是动态规划的一个常见应用,但是有一个问题在于,这种题第一眼看过去很难不会第一时间想到深搜啊。希望下次看到能直接想到动态规划叭。
63. 不同路径Ⅱ
题目描述
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1 和 0 来表示。
示例1:
输入:obstacleGrid=[[0,0,0],[0,1,0],[0,0,0]]obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]obstacleGrid=[[0,0,0],[0,1,0],[0,0,0]]
输出:222
示例2:
输入:obstacleGrid=[[0,1],[0,0]]obstacleGrid = [[0,1],[0,0]]obstacleGrid=[[0,1],[0,0]]
输出:111
思路
本题思路和上一题大致相同,都是使用动态规划,动态规划的方程也一致。在加入了障碍物之后,会想到加入是否有障碍物的判断,如果没有才正常往下走方程。
但这里面有一个不知道是不是小陷阱但我确实踩进去了的坑。就是在初始化的时候,不能单纯跳过有障碍的地方,因为在首行和首列只要中间有一个位置是障碍,那之后的位置都不可到达,需要置为0。还有就是,需要判断起点和终点是否有障碍,有的话直接返回0.
题解
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
int[][] dp = new int[m][n];
if(obstacleGrid[m-1][n-1] == 1 || obstacleGrid[0][0] == 1){
return 0;
}
for(int i = 0;i<m && obstacleGrid[i][0] == 0 ;i++){
dp[i][0] = 1;
}
for(int j = 0;j<n && obstacleGrid[0][j] == 0;j++){
dp[0][j] = 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];
}
}
总结
与上一题相比增加了一些难度,尤其是第一次看到的时候确实会踩到一些想大体思路的时候不会直接想到的小坑,还是要注意。总体来说不是很难,但需要注意细节。
文章介绍了如何使用动态规划解决机器人在网格中找到不同路径的问题,包括没有障碍物的情况和存在障碍物的情况。在无障碍时,从左上角到右下角的路径数量由dp[i][j]=dp[i-1][j]+dp[i][j-1]计算;若有障碍物,则需在计算路径时进行条件判断,避免经过障碍物。总结强调了动态规划的应用和注意细节的重要性。
63

被折叠的 条评论
为什么被折叠?



