【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+1for x1 in range(max(k - n + 1, 0), min(k + 1, n)): y1 = k - x1if grid[x1][y1] == -1:continue# x2比x1大可以剪枝,因为可以自由决定路径for x2 in range(x1, min(k + 1, n)):y2 = k - x2if grid[x2][y2] == -1:continue# 不能合并的原因是可能有0res = 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] = resreturn max(f[-1][-1][-1], 0)

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

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

相关文章

揭秘依赖注入:软件开发人员的基本指南

Dependency injection (DI) is a design pattern and programming technique to manage dependencies between different components. 依赖注入(DI)是一种用于管理不同组件之间依赖关系的设计模式和编程技术。 In DI, the dependencies of a class or ot…

【Linux】-Linux基础命令[2]

目录 一、目录切换相关命令 1、cd 2、pwd 二、相对路径、绝对路径和特殊路径符 1、相对路径和绝对路径 2、特殊路径符 三、创建目录命令(mkdir) 四、文件操作命令 1、touch 创建文件 2、cat查看文件内容 3、more查看文件内容 4、cp命令复制文…

【Unix】FlatBuffers 在 C++ 项目中的使用教程

在 C 项目中使用 FlatBuffers 主要涉及以下几个步骤: 1. 安装 FlatBuffers 首先,你需要在你的系统上安装 FlatBuffers 编译器和库。你可以从 FlatBuffers 的 GitHub 仓库 下载源码并编译: git clone https://github.com/google/flatbuffer…

【JAVA |数组】数组定义与使用、常见的Arrays类介绍

目录 一、前言 二、数组的创建和初始化 三、数组的使用 四、数组是引用类型 1.JVM的内存分配 2.与引用类型变量 3.null 五、二维数组 六、Java中Arrays类的常用方法 1. Arrays.fill ->填充数组 2. Arrays.sort ->数组排序 3. Arrays.toString ->数组打印 …

美易官方:美国经济已现裂痕?美联储再不降息,崩溃即将到来!

美国经济,一度被誉为全球最强大的经济体,如今似乎已显露出脆弱的迹象。华尔街的分析师们纷纷发出警告,呼吁美联储尽快降息,否则一场经济崩溃可能即将来临。 自美联储大幅加息以来,经济学家们一直警告称,高利…

那个在买珠宝的年轻人

金价搭上过山车,今年以来价格一路飙涨。 珍珠身价同步飙升,晋级珠宝圈“新宠”。 文玩圈“减龄”,盘珠串不再只是“老头乐”。 月薪3000的年轻人,悄悄实现“宝石”自由。 黄金珠宝走俏,这届年轻人到底有着怎样的珠宝…

开抖音小店需要交多少保证金?全类目选择,一篇了解

哈喽~我是电商月月 做抖音小店前大家都会搜索“入驻抖音小店需要准备什么东西?”其中就包含了一项:类目保证金的缴纳 那到底要交多少钱?很多新手朋友还是不太了解 今天我就给大家解答这个问题,首先,我们要知道抖店的…

高并发-线程池

文章目录 高并发-线程池2024心得好的博客必会面试题为什么使用线程池线程池的实现原理线程池的拒绝策略阻塞队列已满,在提交任务会发生什么问题threadlocal原理和使用多线程配置 高并发-线程池2024 心得 面试都是围绕着三高展开,高并发,高可…

2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024)

2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024) 2024 International Conference on Virtual Reality, Image and Signal Processing(ICVISP 2024) 会议基本信息 会议时间:2024年8月2-4日 会议地点&#x…

2024年5月软考,别再傻傻啃书了!

备考2024年软考,不听课也不刷题,只是看教材的话,想要考试通过,几乎是不可能的,特别是基础比较薄弱的考生。 为什么只看教材通不过? 如果只是把教材从头到尾看一遍,毫无目的地看书,…

数据结构-线性表-应用题-2.2-5

从顺序表中删除其值在给定值s与t之间&#xff08;包括s和t&#xff0c;且s<t&#xff09;的所有元素&#xff0c;若s或t不合理或顺序表为空&#xff0c;则显示出错信息并退出运行。 从前往后扫描顺序表L&#xff0c;用k记录元素值在[s,t]的元素的个数&#xff0c;对于不在其…

FPGA学习笔记(1)——Vivado和HLS

1 Vivado设计 1.1 FPGA基本知识 Xilinx Atrix-7使用6输入LUT结构&#xff08;0-63&#xff09;CLB&#xff1a;可配置逻辑块Slice&#xff1a;每个CLB包含2个Slice(包含查找表LUT和8位寄存器REG)布线池&#xff1a;围绕在CLB周围&#xff0c;衔接FPGA的资源调度I/O块&#xf…

代码随想录35期Day32-Java

Day32题目 LeetCode122.买股票的最佳时机 核心思想&#xff1a;很简单&#xff0c;只要第二天比第一天贵&#xff0c;就第一天买入&#xff0c;第二天卖出 class Solution {public int maxProfit(int[] prices) {// 只要后一天比这一天价钱高就买&#xff0c;然后第二天卖出…

okcc呼叫中心为什么软电话已经注册,但是坐席监控却显示离线?

这种情况可能有几种可能的原因&#xff1a; 网络连接问题&#xff1a; 坐席监控系统可能无法正常与软电话建立连接&#xff0c;这可能是由于网络故障、防火墙设置或路由问题等引起的。 配置错误&#xff1a; 可能存在软电话配置或坐席监控系统配置方面的错误&#xff0c;导致无…

Qt宏和关键字

Q_GADGET 这个宏是Q_OBJECT宏的弱化版本吧&#xff0c;不过它可以继续 使用属性机制、反射等特性&#xff0c;但是不能使用信号与槽QT_INCLUDE_COMPAT 兼容版本QT_BEGIN_NAMESPACE 防止命名污染Q_GUI_EXPORT 为了实现跨平台以及插件Q_FLAG(RenderHint)&#xff0c;Q_DECLARE_FL…

test我说话撒机房环境

testhfsjafjdsbzvbcxn.ztesthfsjafjdsbzvbcxn.ztesthfsjafjdsbzvbcxn.ztesthfsjafjdsbzvbcxn.ztesthfsjafjdsbzvbcxn.ztesthfsjafjdsbzvbcxn.ztesthfsjafjdsbzvbcxn.ztesthfsjafjdsbzvbcxn.z

启动配置 BOOT

在STM32F10xxx里&#xff0c;可以通过BOOT[1:0]引脚选择三种不同启动模式。 STM32微控制器实现了一个特殊的机制&#xff0c;系统可以不仅仅从Flash存储器或系统存储器启动&#xff0c;还可以从内置SRAM启动。 根据选定的启动模式&#xff0c;主闪存存储器、系统存储器或SRAM可…

centos常用命令介绍

CentOS是一个基于Linux的开源操作系统&#xff0c;它提供了大量的命令和工具&#xff0c;用于管理和配置系统。以下是一些CentOS中常用的命令及其简要介绍&#xff1a; 查看系统信息&#xff1a; uname -a&#xff1a;查看内核/操作系统/CPU信息。 head -n 1 /etc/issue&…

基于 docker-compose 部署 LNMP 架构

目录 前言 1、任务要求 2、Nginx 2.1 建立工作目录并上传相关安装包 2.2 编写 Nginx Dockerfile 脚本 2.3 准备 nginx.conf 配置文件 3、Mysql 3.1 建立工作目录并上传相关安装包 3.2 编写 Mysql Dockerfile 脚本 3.3 编写 my.cnf 配置文件 4、PHP 4.1 建立工作目录…

系统图表:洞察数据的价值与魅力

在数字化、信息化迅猛发展的今天&#xff0c;数据已经成为企业决策、科学研究、社会管理等领域的核心资源。而如何高效、准确地理解和利用这些数据&#xff0c;成为摆在我们面前的重要课题。系统图表作为数据可视化的重要呈现工具&#xff0c;不仅能帮助我们洞察数据的内在规律…