leetcode-不同路径问题

一个机器人位于一个 m x n网格的左上角 (起始点在下图中标记为 "Start" )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 "Finish" )。

问总共有多少条不同的路径?

看见题目我们首先用动态规划四步曲进行分析。

dp数组应该怎么看?我们回想一下爬楼梯,其实本题和他也没什么区别,唯一不同的我们这个是二维的,既然要记录总共的路径那么我们就定义一个二维数组,每一个记录到该点要走多少步,和爬楼梯一样,他是只能走一步或者两步,我们是只能向下或者向右,所以我们每一点的值就等于他上面的和左边的和,毕竟他们俩是不重复的,加起来就是能到该点的所有的路径。

所以得到递推公式: dpij = dpi-1j+dpij-1;

那么我们怎么初始化呢,首先我们看一下递推公式,需要-1,那就意味着我们的第一行和第一列都是要初始化的,所以我们直接把他们赋值成1就可以了。

我们直接上代码

java 复制代码
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];
    }
}  

给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角 (即 grid[0][0])。机器人尝试移动到 右下角 (即 grid[m - 1][n - 1])。机器人每次只能向下或者向右移动一步。

网格中的障碍物和空位置分别用 1 和 0 来表示。机器人的移动路径中不能包含 任何 有障碍物的方格。

返回机器人能够到达右下角的不同路径数量。

测试用例保证答案小于等于 2 * 109。

示例 1:

复制代码
输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

这一题是上一题的变种,我们的路上有障碍了,我们如何规避这个障碍呢 ,首先就是在路程中把障碍物都变成让他没办法走,一开始我就只加了这一个逻辑,但是运行起来发现不对,后来我思考了一下发现还有问题,因为我们的初始化也有问题,如果第一排就有障碍,后面的都是0啊都得不到值,所以把这俩逻辑加进来这个问题就解决啦

java 复制代码
class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;
        if (obstacleGrid[0][0] == 1) {
            return 0;
        }
        // 初始化 dp 数组
        int[][] dp = new int[m][n];
        dp[0][0] = 1; // 起点路径数为 1
        for (int j = 1; j < n; j++) {
            if (obstacleGrid[0][j] == 1) {
                break; // 遇到障碍物,后续路径都为 0
            }
            dp[0][j] = 1;
        }

        // 初始化第一列
        for (int i = 1; i < m; i++) {
            if (obstacleGrid[i][0] == 1) {
                break; // 遇到障碍物,后续路径都为 0
            }
            dp[i][0] = 1;
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (obstacleGrid[i][j] == 1) {
                    dp[i][j] = 0; // 当前格子有障碍物,路径数为 0
                } else {
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; // 状态转移
                }
            }
        }
        return dp[m - 1][n - 1];
    }
}
相关推荐
云淡风轻~窗明几净12 分钟前
角谷猜想最接近严格证明的测试 Version1.1.1
人工智能·算法·机器学习·图论
机器学习之心26 分钟前
PINN × SVM × NSGA-II × 熵权TOPSIS:一套跑通「建模—优化—决策」的多目标优化框架
算法·机器学习·支持向量机
别动我齐刘海1 小时前
机器人 C++ / 系统联调补强2——异常处理、Protobuf
linux·c++·人工智能·学习·算法·机器学习·机器人
文丑颜不良啊2 小时前
LeetCode276~300题目解析
java·leetcode
荆棘鸟智能2 小时前
短历时洪水预报算法实践:水文模型与 LightGBM 残差订正融合
人工智能·算法·机器人
wuyk5552 小时前
《WiFi 嵌入式物联网开发全套实战》 | 第 45 章【终章】WiFi 开发全套知识复盘 + 面试高频题 + 进阶路线
物联网·面试·职场和发展
葫三生2 小时前
关于三生原理系列被技术开发社区批量收录或引发策展边界讨论的一种思考
大数据·人工智能·深度学习·算法·机器学习·数据挖掘·开源
catcatuncle2 小时前
OpenWorkBuddy 部署排错手册:从源码启动到自己搭一个给团队用,七个最容易卡住的地方
算法
avi91112 小时前
【AI教人】在Inspector显示所有Delegate-Odin Inspector之三
java·前端·算法·delegate·inspector·editor扩展·unity editor
淡海水3 小时前
06-02-源码-增量标记算法实现
算法·unity·c#·gc