首页 > 其他分享 >【动态规划】leetcode 不同路径问题

【动态规划】leetcode 不同路径问题

时间:2023-12-27 12:46:32浏览次数:41  
标签:obstacleGrid int 路径 网格 uint32 动态 leetcode dp size

题目名称:63. 不同路径 II

链接:https://leetcode.cn/problems/unique-paths-ii/description/

题目内容:

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

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

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 1 和 0 来表示。

 

朴素解法:使用dp[m][n] 

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m = obstacleGrid.size();
        int n = (*obstacleGrid.begin()).size();
     
        uint32_t *dp = new uint32_t[m*n]();
        if(obstacleGrid[0][0] == 0)//没有障碍物
        {
             *dp = 1;
        }
        else
        {
            *dp = 0;
            return 0;
        }


        for(int i=0; i<m; i++)//行数 [0, m-1]共m行
        {
            int j = 0;
            if(i==0) j=1;//跳过原点

            for(; j<n; j++)//列数[0, n-1]共n列
            {
                if(obstacleGrid[i][j] == 1)//当前有障碍物
                {
                    *(dp+j+n*i) = 0;//dp[i][j]=0 
                }
                else
                {
                    if(i>0&&j>0)
                    {
                        *(dp+j+n*i) = *(dp+j+(n)*(i-1)) + *(dp+(j-1)+(n)*i);//dp[i][j] = dp[i-1][j]+dp[i][j-1]
                    }
                    else if(i==0)//第一行(原点除外)
                    {
                         *(dp+j) =  *(dp+(j-1));  
                    }
                    else if(j==0)//第一列(原点除外)
                    {
                         *(dp+n*i) = *(dp+(n)*(i-1));
                    }
                }
            }
        }
        return *(dp+n*m-1);
    }
};

 

 

滚动数组解法:使用dp[n] 

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m = obstacleGrid.size();
        int n = (*obstacleGrid.begin()).size();
     
        uint32_t *dp = new uint32_t[n]();
        dp[0] = (obstacleGrid[0][0] == 0);
        
        for(int i=0; i<m; i++)//行数 [0, m-1]共m行
        {
            for(int j=0; j<n; j++)//列数[0, n-1]共n列
            {
                if(obstacleGrid[i][j] == 1)//当前有障碍物
                {
                    dp[j] = 0;//dp[i][j]=0 
                }
                else//当前没有障碍物//dp[i][j] = dp[i-1][j]+dp[i][j-1]
                {
                    if(j!=0)
                    {
                        dp[j] = dp[j]+dp[j-1];
                    }
                }
            }
        }
        return dp[n-1];
    }
};

 

标签:obstacleGrid,int,路径,网格,uint32,动态,leetcode,dp,size
From: https://www.cnblogs.com/FBsharl/p/17930310.html

相关文章

  • 在WInform开发中实现工具栏/菜单的动态呈现
    在Winform系统开发中,为了对系统的工具栏/菜单进行动态的控制,我们对系统的工具栏/菜单进行动态配置,这样可以把系统的功能弹性发挥到极致。通过动态工具栏/菜单的配置方式,我们可以很容易的为系统新增所需的功能,通过权限分配的方式,可以更有效的管理系统的菜单分配到不同的角色用户,也......
  • 电脑端 itunes 备份保存路径修改方法
    默认在c盘,重做系统就会丢失。1、先删除C:\Users\你的用户名\AppData\Roaming\AppleComputer里的MobileSync文件夹(首次安装iTunes没有,要先运行一下iTunes)。2、在你想存放iTunes备份的分区,新建一个文件夹,如F:\backup\itunes(你想换成其它名字也可以)3、按住键盘【Win+R】呼出“......
  • Kotlin从入门到精通,正确的学习路径+学习资料
    前言Kotlin是一种针对Java平台的新编程语言。它简洁、安全、务实,专注于与Java的互操作性,可以很好地与所有现存的Java库和框架一起工作,且性能与Java相当。Kotlin可以用于几乎所有Java使用的地方,如服务端开发、Android应用开发等。如何学习学习Kotlin从入门到精通需要按照一定的步......
  • 非动态数组版本下的筛选
    问题:一对多查找(筛选)的结果需要横向排列,但是表格暂时不支持动态数组。右拉下拉公式解决:{=IFERROR(INDEX(FILTER($E:$E,$D:$D=$G2),COLUMN(A1)),"")}公式中的Filter部分筛选出满总D列中等产于G2对应E列的内容,其结果是多个单元格组成的数组。使用Index提取数组中的内容,第二参数用Colum......
  • 动态规划算法(转)
    原文:https://blog.csdn.net/qq_50985215/article/details/125779794?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-125779794-blog-75193592.235^v39^pc_relevant_yljh&spm=1001.2101.3001.4242.1&utm_relevant_i......
  • 二叉树路径总和系列问题
    二叉树路径总和系列问题作者:Grey原文地址:博客园:二叉树路径总和系列问题CSDN:二叉树路径总和系列问题LeetCode112.路径总和定义递归函数booleanprocess(TreeNodenode,intpreSum,inttarget)递归含义表示:从node节点一直到树的叶子节点,preSum表示node之前的节点......
  • leetcode 1633. 各赛事的用户注册率
    https://leetcode.cn/problems/percentage-of-users-attended-a-contest/?envType=study-plan-v2&envId=sql-free-50聚合函数分组后计算的是一组内的数据,分组前我们认为所有数据是一组本题注意还需要嵌套语句selectcontest_id,round(count(user_id)/(selectcoun......
  • 【LeetCode】131. 分割回文串
    题目给你一个字符串s,请你将s分割成一些子串,使每个子串都是回文串。返回s所有可能的分割方案。回文串是正着读和反着读都一样的字符串。示例1:输入:s="aab"输出:[["a","a","b"],["aa","b"]]示例2:输入:s="a"输出:[["a"]]提示:1<......
  • 【LeetCode】17. 电话号码的字母组合
    链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/思路:利用深度优先遍历遍历两个空间第一个空间是digits,命名为space1第二个空间是digits的每一位自身的空间,命名为space2关键是遍历完每一个space2之后,如何转到space1的下一个space2中代码classS......
  • LiveGBS流媒体平台GB/T28181常见问题-配置国标流媒体服务日志文件个数及记录时长配置l
    LiveGBS流媒体平台GB/T28181常见问题-如何配置国标流媒体服务日志文件个数及记录时长1、日志文件2、配置日志文件个数及记录时间3、配置日志文件路径4、相关问题4.1、如何关闭信令日志?5、搭建GB28181视频直播平台1、日志文件部署LiveGBS后,LiveCMS和LiveSMS的解压目录下都个l......