解决leetcode第3418题机器人可以获得的最大金币数

news2025/1/19 16:18:33

3418.机器人可以获得的最大金币数

难度:中等

问题描述:

给你一个mxn的网格。一个机器人从网格的左上角(0,0)出发,目标是到达网格的右下角(m-1,n-1)。在任意时刻,机器人只能向右或向下移动。

网格中的每个单元格包含一个值coins[i][j]:

如果coins[i][j]>=0,机器人可以获得该单元格的金币。

如果coins[i][j]<0,机器人会遇到一个强盗,强盗会抢走该单元格数值的绝对值的金币。

机器人有一项特殊能力,可以在行程中最多感化2个单元格的强盗,从而防止这些单元格的金币被抢走。

注意:机器人的总金币数可以是负数。

返回机器人在路径上可以获得的最大金币数。

示例1:

输入:coins=[[0,1,-1],[1,-2,3],[2,-3,4]]

输出:8

解释:

一个获得最多金币的最优路径如下:

从(0,0)出发,初始金币为0(总金币=0)。

移动到(0,1),获得1枚金币(总金币=0+1=1)。

移动到(1,1),遇到强盗抢走2枚金币。机器人在此处使用一次感化能力,避免被抢(总金币=1)。

移动到(1,2),获得3枚金币(总金币=1+3=4)。

移动到(2,2),获得4枚金币(总金币=4+4=8)。

示例2:

输入:coins=[[10,10,10],[10,10,10]]

输出:40

解释:

一个获得最多金币的最优路径如下:

从(0,0)出发,初始金币为10(总金币=10)。

移动到(0,1),获得10枚金币(总金币=10+10=20)。

移动到(0,2),再获得10枚金币(总金币=20+10=30)。

移动到(1,2),获得10枚金币(总金币=30+10=40)。

提示:

m==coins.length

n==coins[i].length

1<=m,n<=500

-1000<=coins[i][j]<=1000

问题分析:

这是一个中等难度的问题,但却很有意思。

当刚拿到这个题目,觉得每一步只有两种走法,要么向右,要么向下,那么只要比较一下哪一个方向获得的金币数量多,不就可以确定选哪个方向了吗?每一步都这样处理,获得的金币数量不就是最多的吗?但总觉得心里有些不踏实。在纸上用不同的网格测试,网格一这样处理确实可以,找到了“右下右下”的路径就是最佳路径,但网格二就不行了,按照先前的策略处理,应该是“右下下右”的路径,金币数为14,但按“下下右右”的路径,获得的金币数反而有15,可见那种每一步向获得金币数最多的方向走的策略是不行的,因而心里不踏实也是有道理的。如果再加上还要感化强盗,就更不好处理了。

那么如果找到从网格左上角到右下角的所有路径,并把每一条路径上的金币都找出来,再来处理其中感化强盗问题就简单多了。如果路径中的金币数量为负的个数只有一个或两个,直接感化掉就可以了,如果金币数量为负的个数多于两个,感化掉值最小的两个就可以了。

所以现在的问题就是如何求出从网格左上角到右下角的所有路径了。

对于mXn的网格,要从左上角到右下角,不管怎么走,向下要走m-1步,向右要走n-1步,而每一步只有向右和向下两种走法,这就是一个排列组合问题,通过递归可以实现。

程序如下:

#取出到达位置的金币
def get_coin(i,j,coins):
    return coins[i][j]

#1表示向右,2表示向下,找出总共m+n-2步,每步只有1或2两种走法的全排列
def qlist(n):
    if n == 1:
        return ['1', '2']
    elif n == 2:
        return ['11', '12', '21', '22']
    else:
        a = chengfa(['1', '2'], qlist(n - 1))
        return a

def chengfa(a, b):
    return [i + j for i in a for j in b]

#对全排列进行处理,返回一个coins的走法全排列字符串,每个字符串通过1和2的组合给出了各种路径
def get_all_road(coins):
    m=len(coins)
    n=len(coins[0])
    b=m+n-2
    q=qlist(b)
    d=[x for x in q if x.count('1')==n-1]
    print('所有路径列表:',d)
    return d

#根据flag指示的走法和当前坐标,给出下一个走到的位置坐标
def get_point(i,j,flag):
    if flag=='1':
        return [i,j+1]
    else:
        return [i+1,j]

# 对一条线路lj处理,取得这条线路的金币数形成列表,并处理感化强盗问题,然后返回这条线路得到的最大金币数
def get_one_coin(coins, lj):
    print(f'解析{lj}线路')
    i=0 #左上角
    j=0 #左上角
    k=0 #记录感化次数
    m=[get_coin(0,0,coins)]
    for c in lj:
        if c=='1':
            print('向右',end='  ')
        else:
            print('向下',end='  ')
        d=get_point(i,j,c)
        i=d[0]
        j=d[1]
        e=get_coin(i,j,coins)
        m.append(e)
    print('按路径提取出的金币列表:',m)
    #统计小于0的个数
    n=len([x for x in m if x<0])
    if n>2:
        c=coin_more_2(m)
    else:
        c=coin_less_3(m)
    print('本线路获得的最大金币数:',c)
    return c


#负数少于3个的时候处理办法
def coin_less_3(m):
    m=[x for x in m if x>=0]
    print('经过感化之后的金币列表:',m)
    return sum(m)
#负数多于2个的时候的处理办法
def coin_more_2(m):
    t1=min(m)
    m.remove(t1)
    t1=min(m)
    m.remove(t1)
    print('经过感化之后的金币列表:',m)
    return sum(m)

#对所有路径进行处理,得到各条路径获得的最大金币,并取得其中的最大值返回
def get_all_coin(coins):
    road=get_all_road(coins)
    a=[]
    for i in road:
        a.append(get_one_coin(coins,i))
    return max(a)

coins=eval(input('pls input coins='))
print('网格可以获得的最大金币数为:',get_all_coin(coins))

运行实例一

pls input coins=[[0,1,-1,3],[1,-2,3,5],[2,6,-3,4]]

所有路径列表: ['11122', '11212', '11221', '12112', '12121', '12211', '21112', '21121', '21211', '22111']

解析11122线路

向右  向右  向右  向下  向下  按路径提取出的金币列表: [0, 1, -1, 3, 5, 4]

经过感化之后的金币列表: [0, 1, 3, 5, 4]

本线路获得的最大金币数: 13

解析11212线路

向右  向右  向下  向右  向下  按路径提取出的金币列表: [0, 1, -1, 3, 5, 4]

经过感化之后的金币列表: [0, 1, 3, 5, 4]

本线路获得的最大金币数: 13

解析11221线路

向右  向右  向下  向下  向右  按路径提取出的金币列表: [0, 1, -1, 3, -3, 4]

经过感化之后的金币列表: [0, 1, 3, 4]

本线路获得的最大金币数: 8

解析12112线路

向右  向下  向右  向右  向下  按路径提取出的金币列表: [0, 1, -2, 3, 5, 4]

经过感化之后的金币列表: [0, 1, 3, 5, 4]

本线路获得的最大金币数: 13

解析12121线路

向右  向下  向右  向下  向右  按路径提取出的金币列表: [0, 1, -2, 3, -3, 4]

经过感化之后的金币列表: [0, 1, 3, 4]

本线路获得的最大金币数: 8

解析12211线路

向右  向下  向下  向右  向右  按路径提取出的金币列表: [0, 1, -2, 6, -3, 4]

经过感化之后的金币列表: [0, 1, 6, 4]

本线路获得的最大金币数: 11

解析21112线路

向下  向右  向右  向右  向下  按路径提取出的金币列表: [0, 1, -2, 3, 5, 4]

经过感化之后的金币列表: [0, 1, 3, 5, 4]

本线路获得的最大金币数: 13

解析21121线路

向下  向右  向右  向下  向右  按路径提取出的金币列表: [0, 1, -2, 3, -3, 4]

经过感化之后的金币列表: [0, 1, 3, 4]

本线路获得的最大金币数: 8

解析21211线路

向下  向右  向下  向右  向右  按路径提取出的金币列表: [0, 1, -2, 6, -3, 4]

经过感化之后的金币列表: [0, 1, 6, 4]

本线路获得的最大金币数: 11

解析22111线路

向下  向下  向右  向右  向右  按路径提取出的金币列表: [0, 1, 2, 6, -3, 4]

经过感化之后的金币列表: [0, 1, 2, 6, 4]

本线路获得的最大金币数: 13

网格可以获得的最大金币数为: 13

运行实例二

pls input coins=[[0,1,-1],[1,-2,3],[2,-3,4]]

所有路径列表: ['1122', '1212', '1221', '2112', '2121', '2211']

解析1122线路

向右  向右  向下  向下  按路径提取出的金币列表: [0, 1, -1, 3, 4]

经过感化之后的金币列表: [0, 1, 3, 4]

本线路获得的最大金币数: 8

解析1212线路

向右  向下  向右  向下  按路径提取出的金币列表: [0, 1, -2, 3, 4]

经过感化之后的金币列表: [0, 1, 3, 4]

本线路获得的最大金币数: 8

解析1221线路

向右  向下  向下  向右  按路径提取出的金币列表: [0, 1, -2, -3, 4]

经过感化之后的金币列表: [0, 1, 4]

本线路获得的最大金币数: 5

解析2112线路

向下  向右  向右  向下  按路径提取出的金币列表: [0, 1, -2, 3, 4]

经过感化之后的金币列表: [0, 1, 3, 4]

本线路获得的最大金币数: 8

解析2121线路

向下  向右  向下  向右  按路径提取出的金币列表: [0, 1, -2, -3, 4]

经过感化之后的金币列表: [0, 1, 4]

本线路获得的最大金币数: 5

解析2211线路

向下  向下  向右  向右  按路径提取出的金币列表: [0, 1, 2, -3, 4]

经过感化之后的金币列表: [0, 1, 2, 4]

本线路获得的最大金币数: 7

网格可以获得的最大金币数为: 8

运行实例三

pls input coins=[[1,3,1],[2,2,3],[4,5,3]]

所有路径列表: ['1122', '1212', '1221', '2112', '2121', '2211']

解析1122线路

向右  向右  向下  向下  按路径提取出的金币列表: [1, 3, 1, 3, 3]

经过感化之后的金币列表: [1, 3, 1, 3, 3]

本线路获得的最大金币数: 11

解析1212线路

向右  向下  向右  向下  按路径提取出的金币列表: [1, 3, 2, 3, 3]

经过感化之后的金币列表: [1, 3, 2, 3, 3]

本线路获得的最大金币数: 12

解析1221线路

向右  向下  向下  向右  按路径提取出的金币列表: [1, 3, 2, 5, 3]

经过感化之后的金币列表: [1, 3, 2, 5, 3]

本线路获得的最大金币数: 14

解析2112线路

向下  向右  向右  向下  按路径提取出的金币列表: [1, 2, 2, 3, 3]

经过感化之后的金币列表: [1, 2, 2, 3, 3]

本线路获得的最大金币数: 11

解析2121线路

向下  向右  向下  向右  按路径提取出的金币列表: [1, 2, 2, 5, 3]

经过感化之后的金币列表: [1, 2, 2, 5, 3]

本线路获得的最大金币数: 13

解析2211线路

向下  向下  向右  向右  按路径提取出的金币列表: [1, 2, 4, 5, 3]

经过感化之后的金币列表: [1, 2, 4, 5, 3]

本线路获得的最大金币数: 15

网格可以获得的最大金币数为: 15

通过计算得知,一个三阶矩阵有6条路径,四阶矩阵有20条路径,随着矩阵阶数的增加,路径数量呈几何级数增加,对于行列不等的矩阵也是如此,因此感叹只有借助于计算机地耐心解析,才可以更直观地观察到解决问题的过程,让结果更让人信服!

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

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

相关文章

python实现pdf转word和excel

一、引言   在办公中&#xff0c;我们经常遇收到pdf文件格式&#xff0c;因为pdf格式文件不易修改&#xff0c;当我们需要编辑这些pdf文件时&#xff0c;经常需要开通会员或收费功能才能使用编辑功能。今天&#xff0c;我要和大家分享的&#xff0c;是如何使用python编程实现…

【实践】操作系统智能助手OS Copilot新功能测评

一、引言 数字化加速发展&#xff0c;尤其人工智能的发展速度越来越快。操作系统智能助手成为提升用户体验与操作效率的关键因素。OS Copilot借助语言模型&#xff0c;人工智能等&#xff0c;对操作系统的自然语言交互操作 推出很多功能&#xff0c;值得开发&#xff0c;尤其运…

人物一致性训练测评数据集

1.Pulid 训练:由1.5M张从互联网收集的高质量人类图像组成,图像标题由blip2自动生成。 测试:从互联网上收集了一个多样化的肖像测试集,该数据集涵盖了多种肤色、年龄和性别,共计120张图像,我们称之为DivID-120,作为补充资源,还使用了最近开源的测试集Unsplash-50,包含…

【深度学习实战】kaggle 自动驾驶的假场景分类

本次分享我在kaggle中参与竞赛的历程&#xff0c;这个版本是我的第一版&#xff0c;使用的是vgg。欢迎大家进行建议和交流。 概述 判断自动驾驶场景是真是假&#xff0c;训练神经网络或使用任何算法来分类驾驶场景的图像是真实的还是虚假的。 图像采用 RGB 格式并以 JPEG 格式…

网络编程 | UDP套接字通信及编程实现经验教程

1、UDP基础 传输层主要应用的协议模型有两种&#xff0c;一种是TCP协议&#xff0c;另外一种则是UDP协议。在上一篇博客文章中&#xff0c;已经对TCP协议及如何编程实现进行了详细的梳理讲解&#xff0c;在本文中&#xff0c;主要讲解与TCP一样广泛使用了另一种协议&#xff1a…

【Linux】线程全解:概念、操作、互斥与同步机制、线程池实现

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长&#xff0c;行则将至 目录 &#x1f4da;一、线程概念 &#x1f4d6; 回顾进程 &#x1f4d6; 引入线程 &#x1f4d6; 总结 &a…

掌握未来:从零开始学习生成式AI大模型!

随着人工智能技术的飞速发展&#xff0c;生成式AI大模型已成为当今科技领域的热点。从文本生成、图像创作到音乐创作&#xff0c;生成式AI大模型在各个领域展现出惊人的潜力。本文将带领大家从零开始&#xff0c;逐步学习生成式AI大模型&#xff0c;掌握未来的关键技术。 一、生…

多肽合成 -- 液相合成(liquid-phase peptide synthesis (LPPS))

液相合成的定义 液相合成&#xff08;Solution Synthesis&#xff09;是指在液体介质中进行的化学合成反应&#xff0c;是化学合成中一种基本且重要的方法。它涉及到将反应物溶解在溶剂中&#xff0c;在一定的温度、压力和其他反应条件下进行化学反应&#xff0c;从而生成所需的…

第23篇 基于ARM A9处理器用汇编语言实现中断<五>

Q&#xff1a;怎样修改HPS Timer 0定时器产生的中断周期&#xff1f; A&#xff1a;在上一期实验的基础上&#xff0c;可以修改按键中断服务程序&#xff0c;实现红色LED上的计数值递增的速率&#xff0c;主程序和其余代码文件不用修改。 实现以下功能&#xff1a;按下KEY0…

ChatGPT大模型极简应用开发-CH1-初识 GPT-4 和 ChatGPT

文章目录 1.1 LLM 概述1.1.1 语言模型和NLP基础1.1.2 Transformer及在LLM中的作用1.1.3 解密 GPT 模型的标记化和预测步骤 1.2 GPT 模型简史&#xff1a;从 GPT-1 到 GPT-41.2.1 GPT11.2.2 GPT21.2.3 GPT-31.2.4 从 GPT-3 到 InstructGPT1.2.5 GPT-3.5、Codex 和 ChatGPT1.2.6 …

2025春秋杯冬季赛 day1 crypto

文章目录 通往哈希的旅程小哈斯RSA1ez_rsa 通往哈希的旅程 根据提示推断是哈希函数&#xff0c;ai一下&#xff0c;推测大概率是一个sha1&#xff0c;让ai写一个爆破脚本即可 import hashlib# 给定目标 SHA-1 哈希值 target_hash "ca12fd8250972ec363a16593356abb1f3cf…

广播网络实验

1 实验内容 1、构建星性拓扑下的广播网络,实现hub各端口的数据广播,验证网络的连通性并测试网络效率 2、构建环形拓扑网络,验证该拓扑下结点广播会产生数据包环路 2 实验流程与结果分析 2.1 实验环境 ubuntu、mininet、xterm、wireshark、iperf 2.2 实验方案与结果分析…

RustDesk ID更新脚本

RustDesk ID更新脚本 此PowerShell脚本自动更新RustDesk ID和密码&#xff0c;并将信息安全地存储在Bitwarden中。 特点 使用以下选项更新RustDesk ID&#xff1a; 使用系统主机名生成一个随机的9位数输入自定义值 为RustDesk生成新的随机密码将RustDesk ID和密码安全地存储…

JavaEE之常见的锁策略

前面我们学习过线程不安全问题&#xff0c;我们通过给代码加锁来解决线程不安全问题&#xff0c;在生活中我们也知道有很多种类型的锁&#xff0c;同时在代码的世界当中&#xff0c;也对应着很多类型的锁&#xff0c;今天我们对锁一探究竟&#xff01; 1. 常见的锁策略 注意: …

数字图像处理:实验二

任务一&#xff1a; 将不同像素&#xff08;32、64和256&#xff09;的原图像放大为像素大 小为1024*1024的图像&#xff08;图像自选&#xff09; 要求&#xff1a;1&#xff09;输出一幅图&#xff0c;该图包含六幅子图&#xff0c;第一排是原图&#xff0c;第 二排是对应放大…

WEB渗透技术研究与安全防御

目录 作品简介I IntroductionII 1 网络面临的主要威胁1 1.1 技术安全1 2 分析Web渗透技术2 2.1 Web渗透技术的概念2 2.2 Web漏洞产生的原因2 2.3 注入测试3 2.3.1 注入测试的攻击流程3 2.3.2 进行一次完整的Sql注入测试4 2.3.3 Cookie注入攻击11 3 安全防御方案设计…

使用 Thermal Desktop 进行航天器热分析

介绍 将航天器保持在运行温度下的轨道上是一个具有挑战性的问题。航天器需要处理太空非常寒冷的背景温度&#xff0c;同时还要管理来自内部组件、地球反照率和太阳辐射的高热负荷。航天器在轨道上可以进行的各种轨道机动使解决这个问题变得更加复杂。 Thermal Desktop 是一款…

乘联会:1月汽车零售预计175万辆 环比暴跌33.6%

快科技1月18日消息&#xff0c;据乘联会的初步推算&#xff0c;2025年1月狭义乘用车零售总市场规模预计将达到约175万辆左右。与去年同期相比&#xff0c;这一数据呈现了-14.6%的同比下降态势&#xff1b;而相较于上个月&#xff0c;则出现了-33.6%的环比暴跌情况。 为了更清晰…

SQL 递归 ---- WITH RECURSIVE 的用法

SQL 递归 ---- WITH RECURSIVE 的用法 开发中遇到了一个需求&#xff0c;传递一个父类id&#xff0c;获取父类的信息&#xff0c;同时获取其所有子类的信息。 首先想到的是通过程序中去递归查&#xff0c;但这种方法着实孬了一点&#xff0c;于是想&#xff0c;sql能不能递归查…

【机器学习实战入门项目】使用深度学习创建您自己的表情符号

深度学习项目入门——让你更接近数据科学的梦想 表情符号或头像是表示非语言暗示的方式。这些暗示已成为在线聊天、产品评论、品牌情感等的重要组成部分。这也促使数据科学领域越来越多的研究致力于表情驱动的故事讲述。 随着计算机视觉和深度学习的进步&#xff0c;现在可以…