【Leetcode】741.摘樱桃

给你一个 n x n 的网格 grid ,代表一块樱桃地,每个格子由以下三种数字的一种来表示:
0 表示这个格子是空的,所以你可以穿过它。
1 表示这个格子里装着一个樱桃,你可以摘到樱桃然后穿过它。
-1 表示这个格子里有荆棘,挡着你的路。
请你统计并返回:在遵守下列规则的情况下,能摘到的最多樱桃数:
从位置 (0, 0) 出发,最后到达 (n - 1, n - 1) ,只能向下或向右走,并且只能穿越有效的格子(即只可以穿过值为 0 或者 1 的格子);
当到达 (n - 1, n - 1) 后,你要继续走,直到返回到 (0, 0) ,只能向上或向左走,并且只能穿越有效的格子;
当你经过一个格子且这个格子包含一个樱桃时,你将摘到樱桃并且这个格子会变成空的(值变为 0 );
如果在 (0, 0) 和 (n - 1, n - 1) 之间不存在一条可经过的路径,则无法摘到任何一个樱桃。

最初的理解版本是以为agent可以反复走到开头,因此比较像一个水把整个容器灌满看看能摘到多少樱桃的感觉,所以只需要遍历得到一个和grid同尺寸的mask, m a s k [ i ] [ j ] mask[i][j] mask[i][j]表示是否能够从 ( 0 , 0 ) (0,0) (0,0)走到 ( i , j ) (i,j) (i,j)再到达 ( n − 1 , n − 1 ) (n-1,n-1) (n1,n1)。之后用该mask覆盖原grid求和即可得到樱桃数。然而发现其是只走两遍(很尴尬)。

可以很容易地理解这个问题等价于两个人从 ( 0 , 0 ) (0,0) (0,0)出发走到终点这个过程中可以采到多少樱桃。如果只有一个人我们可以很容易想到DP的方法。转移方程可以以从 ( i , j ) (i,j) (i,j)到达终点能够采到的樱桃来写,荆棘可记为-1。则转移方程即为 f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j ] , f [ i ] [ j − 1 ] ) + g r i d [ i ] [ j ] f[i][j] = max(f[i-1][j], f[i][j-1]) + grid[i][j] f[i][j]=max(f[i1][j],f[i][j1])+grid[i][j],若是荆棘则置0 。但是两人同时走时存在贪心次优的问题。因此需要考虑如何解决次优问题。

为了避免DP出一个O(n4)的算法,我们需要将两个ij进行合并,同时出发可以通过时间t来合并一项坐标。

class Solution(object):
    def cherryPickup(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        n = len(grid[0])
        f = [[[-100000 for _ in range(n)] for _ in range(n)] for _ in range(2 * n - 1)]
        f[0][0][0] = grid[0][0]
        for k in range(1, 2 * n - 1):
            # 当k>n时,x一定有步数,最小步为k-n+1
            for x1 in range(max(k - n + 1, 0), min(k + 1, n)): 
                y1 = k - x1
                if grid[x1][y1] == -1:
                    continue
                # x2比x1大可以剪枝,因为可以自由决定路径
                for x2 in range(x1, min(k + 1, n)):
                    y2 = k - x2
                    if grid[x2][y2] == -1:
                        continue
                    # 不能合并的原因是可能有0
                    res = f[k - 1][x1][x2]  # 都往右
                    if x1:
                        res = max(res, f[k - 1][x1 - 1][x2])  # 往下,往右
                    if x2:
                        res = max(res, f[k - 1][x1][x2 - 1])  # 往右,往下
                    if x1 and x2:
                        res = max(res, f[k - 1][x1 - 1][x2 - 1])  # 都往下
                    res += grid[x1][y1]
                    if x2 != x1:
                        res += grid[x2][y2]
                    f[k][x1][x2] = res
        return max(f[-1][-1][-1], 0)


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flink checkpoint 源码分析- Checkpoint snapshot 处理流程

背景 在上一篇博客中我们分析了代码中barrier的是如何流动改的。Flink checkpoint 源码分析- Checkpoint barrier 传递源码分析-CSDN博客 最后跟踪到了代码org.apache.flink.streaming.runtime.io.checkpointing.CheckpointedInputGate#handleEvent 现在我们接着跟踪相应代…

投资线上黄金是否属于外汇交易?探究黄金与外汇市场的关系

在金融市场中,线上黄金投资和外汇交易都是备受关注的领域。许多人可能会混淆这两者,认为投资线上黄金也是一种外汇交易。但实际上,尽管线上黄金和外汇交易有一些相似之处,但它们在本质上是不同的投资领域。本文将探讨投资线上黄金…

前端 Android App 上架详细流程 (Android App)

1、准备上架所需要的材料 先在需要上架的官方网站注册账号。提前把手机号,名字,身份证等等材料准备好,完成开发者实名认证;软著是必要的,提前准备好,软著申请时间比较长大概需要1-2周时间才能下来&#xf…

流畅的python-学习笔记_序列修改+散列+切片

vector第一版 reprlib.repr用于选取有限长度较长变量 vector第二版切片 注意切片还有indices属性,它可以入参一个序列长度,根据此序列长度,转化不规矩的start stop stride, vector第三版动态存取属性 obj.attra时,先…

构建 imx6ull sd 卡启动

1. 硬件环境 imx6ull 256MB tf 卡 512 MB 的 ddr; ubuntu 20.04; 芯片默认的启动方式是通过 LCD_DATA0 ~ LCD_DATA23;上下拉方式来确认的; 需要注意的上下拉是 BOOT_CFG1[7] BOOT_CFG1[6] BOOT_CFG1[5] 启动选择 和 BOOT_CF…

leetcode-矩阵最长递增路径-102

题目要求 思路 1.通过双循环去把每一个结点作为起始点进行统计,将返回的路径长度存放在res中,取最大的res的长度。 2.递归中需要的几个值,x和y当前结点的坐标,pre用于存储上一个结点的元素值,因为要求是路径上的元素是…

3D 交互展示该怎么做?

在博维数孪(Bowell)平台制作3D交互展示的流程相对简单,主要分为以下几个步骤: 1、准备3D模型:首先,你需要有一个3D模型。如果你有3D建模的经验,可以使用3ds Max或Blender等软件自行创建。如果没…

前后端分离项目中的一些疑惑

1、前后端分离项目,浏览器发起请求后,请求的是前端服务器还是后端服务器? 在前后端分离的项目中,当浏览器发起请求时,它首先会请求的是前端服务器。 前后端分离的工作流程大致如下: 用户在浏览器中输入网…

Echarts散点图的29个配置项,散点图可以随心所欲啦。

1-9 当使用 ECharts 绘制散点图时,可以配置以下一些常用的选项: 1. tooltip:配置提示框组件,用于显示鼠标悬停在散点上时的提示信息。 2. legend:配置图例组件,用于展示不同散点的标识和名称。 3. xAxis…

图数据库 之 Neo4j 与 AI 大模型的结合绘制知识图谱

引言 随着信息时代的到来,海量的文本数据成为了我们获取知识的重要来源。然而,如何从这些文本数据中提取出有用的信息,并将其以可视化的方式展示出来,一直是一个具有挑战性的问题。近年来,随着人工智能技术的发展&…

rust使用serde_json转换Value为rust中的数据类型

为了方便转换未知json数据,我们可以使用serde提供的value类型来进行转换,将json字符串转化为Value值,然后可以快速使用get方法来获取值: let json_str r#"{"name": "John","age": 30,"c…

科技控必看!让你轻松成为机器人领域达人

科技控们注意了!你是不是经常对机器人技术充满无限的好奇,却又因为缺乏合适的渠道而难以深入了解和亲身体验呢?别担心,BFT机器人,正是你探索机器人世界的绝佳之地! 在这里,你将发现一个充满惊喜…

政安晨:【Keras机器学习示例演绎】(三十九)—— 使用 FNet 进行文本分类

目录 简介 模型 设置 加载数据集 对数据进行标记 格式化数据集 建立模型 训练我们的模型 与变换器模型比较 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&…

Linux学习之高级IO

之前的内容我们基本掌握了基础IO,如套接字,文件描述符,重定向,缓冲区等知识都是文的基本认识,而高级IO则是指更加高效的IO。 对于应用层,在读写的时候,本质就是把数据写给OS,若一方…

1W 3KVDC 隔离 单输出 DC/DC 电源模块 ——TPF 系列

TPF系列提供输出稳压,精度高,对于输出电压有要求的场合特别适合,工业级环境温度,用于PCB安装的国际标准结构。此系列产品小巧,效率高,低输出纹波及提供3000V以上的直流电压隔离,封装有SIP和DIP可…

实测幻方新出的超强AI大模型,中文能力对比GPT4.0不落下风

目前从网上的消息来看,DeepSeek中文综合能力(AlignBench)开源模型中最强,与GPT-4-Turbo,文心4.0等闭源模型在评测中处于同一梯队。 话不多说,我们开测! 1.首先我们来让他直接来一段逻辑推理【并…

Jetpack Compose三:主题和基础控件的使用

设置主题 与Android View的主题定义方式不同,Jetpack Compose中的主题由许多较低级别的结构体和相关API组成,它们包括颜色、排版和形状属性。 Theme.kt控制工程的主题,它是一个可组合的Compose函数 最后主题函数ComposeStudyTheme的相关设置…

安装Nox夜神模拟器关闭了HyperV后Docker运行不了怎么办?

1.背景 为了模拟真机,尝试安装了Nox夜神模拟器, 安装过程要求关闭Hyper-V。当时只是在程序安装卸载中关闭了系统服务。以为到时勾选上就好了。操作路径:控制面板\所有控制面板项\程序和功能\启用或关闭Windows功能\Hyper-V。 后来卸载掉了夜神…

D盘被格式化了能找回吗 d盘格式化了数据可以找回来吗

D盘作为电脑中重要的磁盘之一,很多用户都会将一些重要的数据保存在D盘。但在磁盘空间不足的情况下,或许有些用户会将其进行格式化,D盘被格式化了如何恢复数据? 如果是比较重要的数据,建议用户立即进行数据恢复操作&am…

Java-异常处理-定义三角形类Triangle和异常三角形IllegalTriangleException类 (1/2)

任意一个三角形,其任意两边之和大于第三边。当三角形的三条边不满足前述条件时,就表示发生了异常,将这种异常情况定义为IllegalTriangleException类。 自定义异常类IllegalTriangleException: 当三角形的三条边不满足条件&#x…
最新文章