动态规划 Ⅱ

2023-09-16 10:12:18

62. 不同路径

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

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

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

思路:dp[i][j] = dp[i-1]dp[j] + dp[ i] + dp[j-1],  dp[i][j] = 0 when i=0 or j = 0. dp数组可优化为滚动数组

python,滚动数组

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        dp = [1 for _ in range(n)]
        
        for i in range(1, m):
            for j in range(1,len(dp)):
                dp[j] += dp[j-1]
        
        return dp[-1]

63. 不同路径 II

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

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

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

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

思路,转移方程与不同路径Ⅰ类似,但是要注意障碍物的存在,dp数组时,对应的位置置为0,且dp数组不会在这个位置上更新。初始第一行或第一列时,遇到障碍物后面的位置默认置零。

python:二维数组

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid):
        m = len(obstacleGrid)
        n = len(obstacleGrid[0])
        if obstacleGrid[m - 1][n - 1] == 1 or obstacleGrid[0][0] == 1:
            return 0
        dp = [[0] * n for _ in range(m)]
        for i in range(m):
            if obstacleGrid[i][0] == 0:  # 遇到障碍物时,直接退出循环,后面默认都是0
                dp[i][0] = 1
            else:
                break
        for j in range(n):
            if obstacleGrid[0][j] == 0:
                dp[0][j] = 1
            else:
                break
        for i in range(1, m):
            for j in range(1, n):
                if obstacleGrid[i][j] == 1:
                    continue
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
        return dp[m - 1][n - 1]

Python:滚动数组

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid):
        if obstacleGrid[0][0] == 1:
            return 0
        
        m, n = len(obstacleGrid), len(obstacleGrid[0])
        
        dp = [0] * n  
        
        # 初始化第一行的路径数
        for j in range(n):
            if obstacleGrid[0][j] == 1:
                break
            dp[j] = 1

        # 计算其他行的路径数,根据障碍物的dp数组修改优先级最高
        for i in range(1, m):
            if obstacleGrid[i][0] == 1:
                dp[0] = 0
            for j in range(1, n):
                if obstacleGrid[i][j] == 1:
                    dp[j] = 0
                    continue
                
                dp[j] += dp[j - 1]
        
        return dp[-1]  # 返回最后一个元素,即终点的路径数

更多推荐

【产品运营】如何提升B端产品的竞争力(上)

B端产品的核心竞争力不是只有产品功能丰富度、易用度这些维度,判断产品核心竞争力应该基于产品所定位解决的问题场景。B端产品的成交因素很多,包括产品本身、公司品牌、客情关系、成功案例、产品定价、客户成熟度、需求匹配度等,本文只谈产品本身。一、产品竞争力类型B端产品本身的核心竞争力不仅只有产品功能丰富度、易用度这些维度,判断

如何下载安装 WampServer 并结合 cpolar 内网穿透,轻松实现对本地服务的公网访问

文章目录前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1注册账号3.2下载cpolar客户端3.3登录cpolarwebui管理界面3.4创建公网地址4.固定公网地址访问前言Wamp是一个Windows系统下的Apache+PHP+Mysql集成安装环境,是一组常用来搭

【操作系统笔记】并发安全问题

用户态抢占和内核态抢占内核中可以执行以下几种程序:①当前运行的进程:陷阱程序(系统调用)和故障程序(pagefault),进程运行在内核态的时候,其实就是在执行进程在用户态触发的异常对应的异常处理程序②中断处理程序③内核线程用户态线程抢占的调度时机检查当前线程是否需要被抢占的时机点(检查点):时钟中断发生,在时钟中断处

Mybatis的mapper接口实现原理

目录1概述2动态代理和反射对象3源码分析4总结1概述为啥mybatis的mapper只有接口没有实现类,但它却能工作?说起mybatis,大伙应该都用过,有些人甚至底层源码都看过了。在mybatis中,mapper接口是没有实现类的,取而代之的是一个xml文件。也就是说我们调用mapper接口,其实是使用了mapper

代理IP和Socks5代理:跨界电商与爬虫的智能引擎

跨界电商,作为全球市场的一部分,对数据的需求越来越大。同时,随着互联网的发展,爬虫技术也在不断演进,成为了跨界电商的关键工具之一。然而,随之而来的是网站的反爬虫机制和网络安全风险。在这种情况下,代理IP和Socks5代理应运而生,为企业提供了数据采集的解决方案和网络安全的保护。本文将深入研究代理IP和Socks5代理在

视频去LOGO的方法,AI自动完美地去除视频LOGO

喜欢做影视剧剪辑的朋友,可能会遇到下载的影视剧本身存在字幕、台标的情况,这些和新的剪辑主题不相符的原片元素,都会影响我们最终的成片效果。不过也无需烦恼哦,我们可以利用AI视频处理工具,自动去除视频中的logo或其它物体。只要利用好工具,想要去除视频中的logo是一件很简单的事情,AI抠图工具,只需导入需要处理的视频文件

ClickHouse面向列的数据库管理系统(原理简略理解)

目录官网什么是Clickhouse什么是OLAP面向列的数据库与面向行的数据库特点为什么面向列的数据库在OLAP场景中工作得更好为什么ClickHouse这么快真实的处理分析查询OLAP场景的关键属性引擎作用ClickHouse引擎输入/输出CPU官网https://clickhouse.com/什么是Clickhou

Kotlin | 在for、forEach循环中正确的使用break、continue

文章目录for循环中使用break、continueLabel标签forEach中如何退出循环资料Kotlin有三种结构化跳转表达式:return:默认从最直接包围它的函数或者匿名函数返回。break:终止最直接包围它的循环。continue:继续下一次最直接包围它的循环。for循环中使用break、continuef

智能指针介绍(C++)

前言关于智能指针大家或多或少都有听说过,因为在C++中没有GC,所以存在很多内存泄露的风险,所以基于RAII思想设计出了,智能指针,智能指针经过了很多个版本的迭代,从刚开始在C++98中推出了auto_ptr,但是auto_ptr不好用,它的设计存在重大缺陷,又因为C++的官方库更新的很慢,所以在接下来的n年中,没有改

openEuler 亮相全球顶级开源盛会 OSSUMMIT 2023,持续推动智能化未来的实现

2023年9月19日,全球顶级开源峰会OSSUMMITEU2023在西班牙-毕尔巴鄂正式开场。openEuler作为钻石级别赞助参会。这是openEuler继去年正式亮相后的第二次全面参加该峰会。本次会议,openEuler带来Keynote及多场分论坛演讲,涵盖LinuxKernel、编译器、AI、多样性计算、软件供

基于 CPU 在docker 中部署PaddleOCR

1.拉取镜像dockerpullregistry.baidubce.com/paddlepaddle/paddle:2.4.0注:写该文章时,Paddle最新版本为2.5.1,但是在实际安装中会出现与PaddleHub2.3.1版本的冲突,故采用2.4.0版本2.构建并进入容器dockerrun--namepaddle

热文推荐