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

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 adef 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-2q=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.rhkb.cn/news/5570.html

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

相关文章

opengrok_windows_环境搭建

目录 软件列表 软件安装 工程索引 ​编辑 工程部署 问题列表 软件列表 软件名下载地址用途JDKhttps://download.java.net/openjdk/jdk16/ri/openjdk-1636_windows-x64_bin.zipindex 使用java工具tomcathttps://dlcdn.apache.org/tomcat/tomcat-9/v9.0.98/bin/apache-tom…

c++ 与 Matlab 程序的数据比对

文章目录 背景环境数据保存数据加载 背景 ***避免数据精度误差&#xff0c;快速对比变量 *** 环境 c下载 https://github.com/BlueBrain/HighFive 以及hdf5库 在vs 中配置库 数据保存 #include <highfive/highfive.hpp> using namespace HighFive;std::string fil…

【2024 博客之星评选】请继续保持Passion

我尝试复盘自己2024年走的路&#xff0c;希望能给诸君一些借鉴。 文章目录 回头望感想与收获成长与教训今年计划感恩一些体己话 回头望 回望我的2024年&#xff0c;年初拿高绩效&#xff0c;但感觉逐渐被公司一点点剥离出中心&#xff1b;年中一直在学习防患于未然&#xff1b…

unity插件Excel转换Proto插件-ExcelToProtobufferTool

unity插件Excel转换Proto插件-ExcelToProtobufferTool **ExcelToProtobufTool 插件文档****1. 插件概述****2. 默认配置类&#xff1a;DefaultIProtoPathConfig****属性说明** **3. 自定义配置类****定义规则****示例代码** **4. 使用方式****4.1 默认路径****4.2 自定义路径**…

总结 uniapp 上不适配iphone的:new Date 时间、border线条、渐变

1、border样式缺了一边 这是错误样式&#xff1a; 需要添加: border: 1rpx solid #57c7bb; transform: rotateZ(0deg);//加入此代码解决iphone 不适配问题2、时间出现NaN 原因是因为ios中使用new Date 的时候出了问题 解决方案: 1.调整时间格式:将时间格式从"yyyy-MM-d…

【深度学习】Java DL4J 2024年度技术总结

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

快速学习GO语言总结

干货分享&#xff0c;感谢您的阅读&#xff01;备注&#xff1a;本博客将自己初步学习GO的总结进行分享&#xff0c;希望大家通过本博客可以在短时间内快速掌握GO的基本程序编码能力&#xff0c;如有错误请留言指正&#xff0c;谢谢&#xff01; 一、初步了解Go语言 &#xf…

【深度学习】2.视觉问题与得分函数

计算机视觉任务 可以通过神经网络搜索是什么类别的动物。 图像实际就是含有数值的三维矩阵。 像素值从0-255可以表示亮度递增的参数。数字越大&#xff0c;像素点越亮。 最后的3表示三个颜色通道&#xff0c;常见的如JPG、RGB等。 现实场景容易发生各种遮蔽现象。 计算机判断…

本地 AI 模型“不实用”?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【Maui】下拉框的实现,绑定键值对

文章目录 前言一、问题描述二、解决方案三、软件开发&#xff08;源码&#xff09;3.1 创建模型3.2 视图界面3.3 控制器逻辑层 四、项目展示 前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架&#xff0c;用于使用 C# 和 XAML 创建本机移动和桌面应用。 使用 .NET MAUI&…

AI守护煤矿安全生产:基于视频智能的煤矿管理系统架构解析

前言 本文我将介绍我和我的团队自主研发设计的一款AI产品的成果展示——“基于视频AI识别技术的煤矿安全生产管理系统”。 这款产品是目前我在创业阶段和几位矿业大学的博士共同从架构设计、开发到交付的全过程中首次在博客频道发布, 我之前一直想写但没有机会来整理这套系统的…

.NET开源的处理分布式事务的解决方案

前言 在分布式系统中&#xff0c;由于各个系统服务之间的独立性和网络通信的不确定性&#xff0c;要确保跨系统的事务操作的最终一致性是一项重大的挑战。今天给大家推荐一个.NET开源的处理分布式事务的解决方案基于 .NET Standard 的 C# 库&#xff1a;CAP。 CAP项目介绍 C…

计算机网络 (52)秘钥分配

一、重要性 在计算机网络中&#xff0c;密钥分配是密钥管理中的一个核心问题。由于密码算法通常是公开的&#xff0c;因此网络的安全性主要依赖于密钥的安全保护。密钥分配的目的是确保密钥在传输过程中不被窃取或篡改&#xff0c;同时确保只有合法的用户才能获得密钥。 二、方…

Open3D计算点云粗糙度(方法一)【2025最新版】

目录 一、Roughness二、代码实现三、结果展示博客长期更新,本文最近更新时间为:2025年1月18日。 一、Roughness 通过菜单栏的Tools > Other > Roughness找到该功能。 这个工具可以估计点云的“粗糙度”。 选择一个或几个点云,然后启动这个工具。 CloudCompare只会询问…

DDD - 整洁架构_解决技术设计困局

文章目录 Pre如何落地 DDD底层技术的更迭 整洁架构的设计主动适配器/北向适配器被动适配器/南向适配器 整洁架构的落地总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服务、实体与值对象的两种设计思路…

一个软件分发和下载的网站源码,带多套模板

PHP游戏应用市场APP软件下载平台网站源码手机版 可自行打包APP&#xff0c;带下载统计&#xff0c;带多套模板&#xff0c;带图文教程 代码下载&#xff1a;百度网盘

OSPF协议部分解读

多年前所写, 主要是对OSPF的RFC协议标准的解读. 工作中接触网络路由协议OSPF的同学可以参考参考.如有理解错误请谅解, 不过可以肯定的是一定有理解错误的地方的. RFC2328 1.1小节 1. OSPF routes IP packets based solely on the destination IPaddress found in the IP pac…

安装wxFormBuilder

1. 网址&#xff1a;GitHub - wxFormBuilder/wxFormBuilder: A wxWidgets GUI Builder 2. 安装MSYS2 MSYS2可以在GitHub的内容中找到&#xff0c;这个版本是32位64位的 3. 在程序中打开MINGW64 shell 4. 在MSYS2 MINGW64 shell中输入 pacman -Syu pacman -S ${MINGW_PACKAGE…

基于微信小程序高校订餐系统的设计与开发ssm+论文源码调试讲解

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xff0c;以及让来访用户可以花费更多时间停留在系统上&#xff0c;则表明该系统设计得比较专…

C#中的语句

C#提供了各式各样的语句&#xff0c;大多数是由C和C发展而来&#xff0c;当然&#xff0c;在C#中做了相应修改。语句和表达式一样&#xff0c;都是C#程序的基本组成部分&#xff0c;在本文我们来一起学习C#语句。 1.语句 语句是构造所有C#程序的过程构造块。在语句中可以声明…