代码随想录算法训练营第三十九天| 62. 不同路径,63. 不同路径 II

62. 不同路径

  1. 搞清楚dp[i][j]的定义
  2. 推导出公式
  3. 遍历顺序,从左到右,从上到下 
  4. dp的初始化

动态规划中如何初始化很重要!| LeetCode:62.不同路径_哔哩哔哩_bilibili《代码随想录》算法公开课开讲啦!快来打卡!本期视频的文字讲解版在「代码随想录」刷题网站:programmercarl.comGithub:https://github.com/youngyangyang04/leetcode-master, 视频播放量 57182、弹幕量 611、点赞数 1237、投硬币枚数 907、收藏人数 349、转发人数 78, 视频作者 代码随想录, 作者简介 我是Carl,哈工大师兄,先后在腾讯和百度从事一线技术研发的程序员,公众号「代码随想录」,相关视频:动态规划之背包问题,装满背包有多少种方法?| LeetCode:494.目标和,从此再也不怕动态规划了,动态规划解题方法论大曝光 !| 理论基础 |力扣刷题总结| 动态规划入门,动态规划入门50题,关于二叉树,你该了解这些!| 二叉树理论基础一网打尽,二叉树的种类、二叉树的存储方式、二叉树节点定义、二叉树的遍历顺序,手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找,我更完了,你看完了吗?,《算法零基础入门》动态规划 (一),一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵),贪心算法理论基础!,动态规划,偷不偷这个房间呢?| LeetCode:198.打家劫舍icon-default.png?t=N7T8https://www.bilibili.com/video/BV1ve4y1x7Eu/?vd_source=8e2358f9b27440129acde1350d40c3cb

class Solution {
/**
     * 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
     */
    public static 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];
    }
}

63. 不同路径 II

跟上面的代码差不多就是在遇到障碍物也就是某个obs[i][j]==0的时候就不能继续移动了。

  1. 注意初始化的时候遇到障碍物就直接停止
  2. dp[i][j] 表达的还是在这个位置有多少种走法而不是步数
  3. 在dp[i][j]==0的时候说明这个位置有障碍物不能走了,就得设置有0种走法到达次位置。

动态规划,这次遇到障碍了| LeetCode:63. 不同路径 II_哔哩哔哩_bilibili《代码随想录》算法公开课开讲啦!快来打卡!本期视频的文字讲解版在「代码随想录」刷题网站:programmercarl.comGithub:https://github.com/youngyangyang04/leetcode-master, 视频播放量 43624、弹幕量 394、点赞数 843、投硬币枚数 633、收藏人数 180、转发人数 35, 视频作者 代码随想录, 作者简介 我是Carl,哈工大师兄,先后在腾讯和百度从事一线技术研发的程序员,公众号「代码随想录」,相关视频:动态规划入门50题,我更完了,你看完了吗?,动态规划(dp)入门 | 这tm才是入门动态规划的正确方式! | dfs记忆化搜索 | 全体起立!!,从此再也不怕动态规划了,动态规划解题方法论大曝光 !| 理论基础 |力扣刷题总结| 动态规划入门,贪心算法理论基础!,带你学透0-1背包问题!| 关于背包问题,你不清楚的地方,这里都讲了!| 动态规划经典问题 | 数据结构与算法,动态规划之背包问题,装满背包有多少种方法?| LeetCode:494.目标和,手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找,带你学透回溯算法-组合问题(对应力扣题目:77.组合)| 回溯法精讲!,动态规划开更了!| LeetCode:746. 使用最小花费爬楼梯icon-default.png?t=N7T8https://www.bilibili.com/video/BV1Ld4y1k7c6/?vd_source=8e2358f9b27440129acde1350d40c3cb

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;
        int[][] dp = new int[m][n];

        //如果在起点或终点出现了障碍,直接返回0
        if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) {
            return 0;
        }

        // obstacleGrid[i][0] == 0 表示遇到障碍物了就不能继续向“右”走了
        for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) {
            dp[i][0] = 1;
        }

        // obstacleGrid[0][j] == 0 表示遇到障碍物了就不能继续向“下”走了
        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++) {
                dp[i][j] = (obstacleGrid[i][j] == 0) ? dp[i - 1][j] + dp[i][j - 1] : 0;
            }
        }
        return dp[m - 1][n - 1];
    }
}

你可能感兴趣的:(算法,动态规划,图论)