动态规划之网格图模型(一)

news2025/6/3 13:53:03

文章目录

  • 动态规划之网格图模型(一)
    • LeetCode 64. 最小路径和
      • 思路
      • Golang 代码
    • LeetCode 62. 不同路径
      • 思路
      • Golang 代码
    • LeetCode 63. 不同路径 II
      • 思路
      • Golang 代码
    • LeetCode 120. 三角形最小路径和
      • 思路
      • Golang 代码
    • LeetCode 3393. 统计异或值为给定值的路径数
      • 思路
      • Golang 代码

动态规划之网格图模型(一)

在这里插入图片描述

网格图是二维(乃至多维)DP 的典型应用场景。其基础模型可以归纳为:给定一个二维地图,从地图上的某个起点出发,到达终点有多少种可能方案(或是到达终点的最小代价是多少)。

LeetCode 64. 最小路径和

思路

题目要求我们寻找一个从左上角到右下角的最小代价,所以我们用二维数组dp[i][j]记录从起点出发到达每一个点(i, j)的最小代价,最终dp[m][n]就是答案。由于每次只能向下或向右移动,因此状态转移方程就是:dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1]

最重要的是处理边界情况,由于我们要求的是路径的最小代价,因此数组的维度开成(m + 1, n + 1),第零行和第零列的值设置为math.MaxInt,为了不在左上角进行特判,设置dp[0][1] = 0

根据以上思路,我们进行编码。

Golang 代码

func minPathSum(grid [][]int) int {
    // 变量声明
    m, n := len(grid), len(grid[0])
    dp := make([][]int, m + 1)
    for i := 0; i <= m; i ++ {
        dp[i] = make([]int, n + 1)
    }

    // 设定初始状态
    for i := 0; i <= m; i ++ {
        dp[i][0] = math.MaxInt
    }
    for j := 0; j <= n; j ++ {
        dp[0][j] = math.MaxInt
    }
    dp[0][1] = 0

    // DP
    for i := 1; i <= m; i ++ {
        for j := 1; j <= n; j ++ {
            dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1]
        }
    }

    return dp[m][n]
}

LeetCode 62. 不同路径

思路

不同路径与「LeetCode 64. 最小路径和」问题非常的相似。区别主要在于状态转移方程的不同。具体来说,使用二维数组dp来表示可能的状态数。dp[i][j]就是从起点出发到达(i, j)的可能状态数。

由于题目要求目标只能在某一点向下或向右移动,对于(i, j)而言,能够到达这一点只能从(i, j - 1)向右移动或是从(i - 1, j)向下移动,因此状态转移方程可以定义为:dp[i][j] = dp[i - 1][j] + dp[i][j - 1]

初始情况的dp[1][1]应该被设置为 1,也就是如果终点与起点重合,那么可能的路径条数就是 1,为了避免处理左上角特判,令dp[0][1] = 1

Golang 代码

func uniquePaths(m int, n int) int {
    dp := make([][]int, m + 1)
    for i := 0; i <= m; i ++ {
        dp[i] = make([]int, n + 1)
    }
    dp[0][1] = 1
    for i := 1; i <= m; i ++ {
        for j := 1; j <= n; j ++ {
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
        }
    }
    return dp[m][n]
}

LeetCode 63. 不同路径 II

思路

本题是「LeetCode 62. 不同路径」的衍生题,在地图当中引入了障碍物,让我们继续求达到右下角的可能路径。

解决这类问题的思路仍然是关注状态转移方程与可能的特殊情况。先说状态转移方程:我们已经知道,在(i, j)这一点,可能的路径只能来自左侧或者上侧,如果左边或上边的一个恰为障碍物,则不需要统计来自于那一格的路径。如果(p, q)为障碍物,我们设置它的dp[p][q] = -1,由此可以得到状态转移方程:dp[i][j] = max(d[i - 1][j], dp[i][j - 1], dp[i - 1][j] + dp[i][j - 1])

特殊情况仍然在左上角,设置dp[0][1] = 1避免左上角特判。

Golang 代码

func uniquePathsWithObstacles(obstacleGrid [][]int) int {
    m, n := len(obstacleGrid), len(obstacleGrid[0])
    dp := make([][]int, m + 1)
    for i := 0; i <= m; i ++ {
        dp[i] = make([]int, n + 1)
    }
    dp[0][1] = 1
    for i := 1; i <= m; i ++ {
        for j := 1; j <= n; j ++ {
            if obstacleGrid[i - 1][j - 1] == 1 {
                dp[i][j] = -1
            } else {
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j] + dp[i][j - 1])
            }
        }
    }
    if dp[m][n] == -1 {
        return 0
    } else {
        return dp[m][n]
    }
}

LeetCode 120. 三角形最小路径和

思路

非常经典的一道 DP 入门题,我比较喜欢采用自底向上的方式解决这道题。

具体来说,首先开一个 DP 数组,DP 数组也是三角形的。之后,直接使用三角形的最后一层来初始化 DP 数组的最后一层,从倒数第二层开始进行 DP,状态转移方程是:dp[i][j] = min(dp[i + 1][j], dp[i + 1][j + 1]) + triangle[i][j]

最后dp[0][0]就是最终答案。

Golang 代码

func minimumTotal(triangle [][]int) int {
    n := len(triangle)
    dp := make([][]int, n)
    for i := 1; i <= n; i ++ {
        dp[i - 1] = make([]int, i)
    }
    for i := 0; i < n; i ++ {
        dp[n - 1][i] = triangle[n - 1][i]
    }
    for i := n - 2; i >= 0; i -- {
        for j := 0; j <= i; j ++ {
            dp[i][j] = min(dp[i + 1][j], dp[i + 1][j + 1]) + triangle[i][j]
        }
    }
    return dp[0][0]
}

LeetCode 3393. 统计异或值为给定值的路径数

思路

这是五道题当中最难的那一道题。具体来说,它是另一个「路径统计」问题的变体,要求我们求出路径上所有数异或和为k的路径数目。因此我们在二维数组的基础上,引入第三个维度,用于记录当前路径的异或和是多少。

针对异或运算,一条特殊的性质是异或可以移项,比如对于x ^ y = k,可以移项变为x = y ^ k,利用这条性质,我们可以构建状态转移方程:dp[i][j][x] = dp[i - 1][j][x ^ grid[i - 1][j - 1]] + dp[i][j - 1][x ^ grid[i - 1][j - 1]]

需要重点关注的问题是,上式中x的含义是什么?针对异或运算,很明显异或的最大值就是grid数组中最大的那个数的二进制位数全为 1 的值,假定这个值为u,如果k不小于u,那么答案就是 0,因为路径上的异或值不可能比异或的最大值还要大。x就是对u从 0 开始进行递增遍历,目的是查看是否有从起点到(i, j)到路径满足异或值为x,最重要搜索的异或值为k

边界条件仍然在左上角,设置dp[0][1][0] = 1避免特判。

Golang 代码

func countPathsWithXorValue(grid [][]int, k int) int {
    const MOD int = 1e9 + 7
    m, n := len(grid), len(grid[0])
    maxx := 0
    for _, row := range grid {
        maxx = max(maxx, slices.Max(row))
    }
    u := 1 << bits.Len(uint(maxx))  // 求出异或可能的最大值
    if k >= u {
        return 0
    }
    dp := make([][][]int, m + 1)
    for i := 0; i <= m; i ++ {
        dp[i] = make([][]int, n + 1)
        for j := 0; j <= n; j ++ {
            dp[i][j] = make([]int, u)
        }
    }
    dp[0][1][0] = 1
    for i := 1; i <= m; i ++ {
        for j := 1; j <= n; j ++ {
            val := grid[i - 1][j - 1]
            for x := 0; x < u; x ++ {
                dp[i][j][x] = (dp[i - 1][j][x ^ val] + dp[i][j - 1][x ^ val]) % MOD
            }
        }
    }
    return dp[m][n][k] % MOD
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2395000.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PCB设计实践(三十)地平面完整性

在高速数字电路和混合信号系统设计中&#xff0c;地平面完整性是决定PCB性能的核心要素之一。本文将从电磁场理论、信号完整性、电源分配系统等多个维度深入剖析地平面设计的关键要点&#xff0c;并提出系统性解决方案。 一、地平面完整性的电磁理论基础 电流回流路径分析 在PC…

使用ray扩展python应用之流式处理应用

流式处理就是数据一来&#xff0c;咱们就得赶紧处理&#xff0c;不能攒批再算。这里的实时不是指瞬间完成&#xff0c;而是要在数据产生的那一刻&#xff0c;或者非常接近那个时间点&#xff0c;就做出响应。这种处理方式&#xff0c;我们称之为流式处理。 流式处理的应用场景…

IP证书的作用与申请全解析:从安全验证到部署实践

在网络安全领域&#xff0c;IP证书&#xff08;IP SSL证书&#xff09;作为传统域名SSL证书的补充方案&#xff0c;专为公网IP地址提供HTTPS加密与身份验证服务。本文将从技术原理、应用场景、申请流程及部署要点四个维度&#xff0c;系统解析IP证书的核心价值与操作指南。 一…

【Linux系列】Linux/Unix 系统中的 CPU 使用率

博客目录 多核处理器时代的 CPU 使用率计算为什么要这样设计&#xff1f; 解读实际案例&#xff1a;268.76%的 CPU 使用率性能分析的意义 相关工具与监控实践1. top 命令2. htop 命令3. mpstat 命令4. sar 命令 实际应用场景容量规划性能调优故障诊断 深入理解&#xff1a;CPU …

C++语法系列之模板进阶

前言 本次会介绍一下非类型模板参数、模板的特化(特例化)和模板的可变参数&#xff0c;不是最开始学的模板 一、非类型模板参数 字面意思,比如&#xff1a; template<size_t N 10> 或者 template<class T,size_t N 10>比如&#xff1a;静态栈就可以用到&#…

基于图神经网络的自然语言处理:融合LangGraph与大型概念模型的情感分析实践

在企业数字化转型进程中&#xff0c;非结构化文本数据的处理与分析已成为核心技术挑战。传统自然语言处理方法在处理客户反馈、社交媒体内容和内部文档等复杂数据集时&#xff0c;往往难以有效捕获文本间的深层语义关联和结构化关系。大型概念模型&#xff08;Large Concept Mo…

R 语言科研绘图 --- 热力图-汇总

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…

解决访问网站提示“405 很抱歉,由于您访问的URL有可能对网站造成安全威胁,您的访问被阻断”问题

一、问题描述 本来前几天都可以正常访问的网站&#xff0c;但是今天当我们访问网站的时候会显示“405 很抱歉&#xff0c;由于您访问的URL有可能对网站造成安全威胁&#xff0c;您的访问被阻断。您的请求ID是&#xff1a;XXXX”&#xff0c;而不能正常的访问网站&#xff0c;如…

机器学习中的关键术语及其含义

神经元及神经网络 机器学习中的神经网络是一种模仿生物神经网络的结构和功能的数学模型或计算模型。它是指按照一定的规则将多个神经元连接起来的网络。 神经网络是一种运算模型&#xff0c;由大量的节点&#xff08;或称神经元&#xff09;之间相互联接构成。每个节点代表一…

网络编程1_网络编程引入

为什么需要网络编程&#xff1f; 用户再在浏览器中&#xff0c;打开在线视频资源等等&#xff0c;实质上说通过网络&#xff0c;获取到从网络上传输过来的一个资源。 与打开本地的文件类似&#xff0c;只是这个文件的来源是网络。相比本地资源来说&#xff0c;网络提供了更为…

【Day38】

DAY 38 Dataset和Dataloader类 对应5. 27作业 知识点回顾&#xff1a; Dataset类的__getitem__和__len__方法&#xff08;本质是python的特殊方法&#xff09;Dataloader类minist手写数据集的了解 作业&#xff1a;了解下cifar数据集&#xff0c;尝试获取其中一张图片 import …

HTML Day04

Day04 0.引言1. HTML字符实体2. HTML表单2.1 表单标签2.2 表单示例 3. HTML框架4. HTML颜色4.1 16进制表示法4.2 rgba表示法4.3 名称表达法 5. HTML脚本 0.引言 刚刚回顾了前面几篇博客&#xff0c;感觉写的内容倒是很详细&#xff0c;每个知识点都做了说明。但是感觉在知识组织…

云原生安全基石:Kubernetes 核心概念与安全实践指南

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. Kubernetes 架构全景 Kubernetes&#xff08;简称 K8s&#xff09;采用主从架构&#xff0c;由控制平面&#xff08;Control Plane&…

autodl 安装了多个conda虚拟环境 选择合适虚拟环境的语句

1.conda env list 列出所有虚拟环境 可以看到&#xff0c;我有两个虚拟环境&#xff0c;一个是joygen&#xff0c;一个是base conda activate base 或者 conda activate joygen 激活对应的环境。我选择激活 joygen 环境 然后就可以在joygen环境下进行操作了 base环境也是同理…

ansible-playbook 进阶 接上一章内容

1.异常中断 做法1&#xff1a;强制正常 编写 nginx 的 playbook 文件 01-zuofa .yml - hosts : web remote_user : root tasks : - name : create new user user : name nginx-test system yes uid 82 shell / sbin / nologin - name : test new user shell : gete…

趋势直线指标

趋势直线副图和主图指标&#xff0c;旨在通过技术分析工具帮助交易者识别市场趋势和潜在的买卖点。 副图指标&#xff1a;基于KDJ指标的交易策略 1. RSV值计算&#xff1a; - RSV&#xff08;未成熟随机值&#xff09;反映了当前收盘价在过去一段时间内的相对位置。通过计算当前…

基线配置管理:为什么它对网络稳定性至关重要

什么是基线配置&#xff08;Baseline Configuration&#xff09; 基线配置&#xff08;Baseline Configuration&#xff09;是经过批准的标准化主设置&#xff0c;代表所有设备应遵循的安全、合规且运行稳定的配置基准&#xff0c;可作为评估变更、偏差或未授权修改的参考基准…

Nest全栈到失业(一):Nest基础知识扫盲

Nest 是什么? 问你一个问题,node是不是把js拉出来浏览器环境运行了?当然,他使用了v8引擎加上自己的底层模块从而实现了,在外部编辑处理文件等;然后它使用很多方式来发送请求是吧,你知道的什么http.request 或 https.request; 我们浏览器中,使用AJAX以及封装AJAX和http的Axios…

摩尔线程S4000国产信创计算卡性能实战——Pytorch转译,多卡P2P通信与MUSA编程

简介 MTT S4000 是基于摩尔线程曲院 GPU 架构打造的全功能元计算卡&#xff0c;为千亿规模大语言模型的训练、微调和推理进行了定制优化&#xff0c;结合先进的图形渲染能力、视频编解码能力和超高清 8K HDR 显示能力&#xff0c;助力人工智能、图形渲染、多媒体、科学计算与物…

Tesseract OCR 安装与中文+英文识别实现

一、下载 https://digi.bib.uni-mannheim.de/tesseract/ 下载&#xff0c;尽量选择时间靠前的&#xff08;识别更好些&#xff09;。符合你的运行机&#xff08;我的是windows64&#xff09; 持续点击下一步安装&#xff0c;安装你认可的路径即可&#xff0c;没必要配置环境变…