力扣每日一题 6/14 动态规划+数组

  • 博客主页:誓则盟约
  • 系列专栏:IT竞赛 专栏
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍ 

2786.访问数组中的位置使分数最大【中等

题目:

给你一个下标从 0 开始的整数数组 nums 和一个正整数 x 。

你 一开始 在数组的位置 0 处,你可以按照下述规则访问数组中的其他位置:

  • 如果你当前在位置 i ,那么你可以移动到满足 i < j 的 任意 位置 j 。
  • 对于你访问的位置 i ,你可以获得分数 nums[i] 。
  • 如果你从位置 i 移动到位置 j 且 nums[i] 和 nums[j] 的 奇偶性 不同,那么你将失去分数 x 。

请你返回你能得到的 最大 得分之和。

注意 ,你一开始的分数为 nums[0] 。

示例 1:

输入:nums = [2,3,6,1,9,2], x = 5
输出:13
解释:我们可以按顺序访问数组中的位置:0 -> 2 -> 3 -> 4 。
对应位置的值为 2 ,6 ,1 和 9 。因为 6 和 1 的奇偶性不同,所以下标从 2 -> 3 让你失去 x = 5 分。
总得分为:2 + 6 + 1 + 9 - 5 = 13 。

示例 2:

输入:nums = [2,4,6,8], x = 3
输出:20
解释:数组中的所有元素奇偶性都一样,所以我们可以将每个元素都访问一次,而且不会失去任何分数。
总得分为:2 + 4 + 6 + 8 = 20 。

提示:

  • 2 <= nums.length <= 10**5
  • 1 <= nums[i], x <= 10**6


分析问题:

  • 这是一个动态规划问题,需要考虑在每个位置上能获得的最大得分。
  • 关键在于判断移动到下一个位置时是否会因为奇偶性不同而失去分数 x,并在此基础上计算最大得分。

解题方案

  1. 定义一个二维数组 dp[i][0] 和 dp[i][1] ,分别表示在位置 i 且当前数字为奇数或偶数时能获得的最大得分。
  2. 初始化 dp[0][0] = nums[0] (如果 nums[0] 为偶数),dp[0][1] = nums[0] (如果 nums[0] 为奇数)。
  3. 从位置 1 开始遍历数组 nums :
    • 如果 nums[i] 为偶数:
      • dp[i][0] = max(dp[i - 1][0] + nums[i], dp[i - 1][1] + nums[i] - x)
      • dp[i][1] = dp[i - 1][1]
    • 如果 nums[i] 为奇数:
      • dp[i][1] = max(dp[i - 1][1] + nums[i], dp[i - 1][0] + nums[i] - x)
      • dp[i][0] = dp[i - 1][0]
  4. 最终的最大得分即为 max(dp[n - 1][0], dp[n - 1][1]) ,其中 n 是数组 nums 的长度。

 代码实现:

from functools import cache
class Solution:def maxScore(self, nums: List[int], x: int) -> int:@cachedef dfs(i,j):if i == len(nums): return 0if nums[i] % 2 != j: return dfs(i+1,j)return max(dfs(i+1,j),dfs(i+1,j^1)-x)+nums[i]return dfs(0,nums[0]%2)

 总结:

           利用 functools 模块中的 cache 装饰器对 dfs 函数进行缓存优化,避免重复计算。

    dfs 函数接受两个参数 i 和 j ,分别表示当前在数组 nums 中的位置和当前数字的奇偶性标志(0 表示偶数,1 表示奇数)。

        函数首先判断如果当前位置 i 达到数组末尾,返回 0 。

        如果当前数字的奇偶性与 j 不一致,直接返回下一个位置且奇偶性不变时的结果,即 dfs(i + 1, j) 。

        否则,返回两种可能情况中的最大值:一是直接移动到下一个位置且奇偶性不变时的结果 dfs(i + 1, j) ,二是移动到下一个位置且奇偶性改变时减去 x 再加上当前数字 nums[i] 的结果 dfs(i + 1, j ^ 1) - x + nums[i] 。

        最终,通过调用 dfs(0, nums[0] % 2) 来计算并返回最大得分。


这道题考察的内容包括

  1. 对动态规划思想的理解和应用,需要找到最优的决策路径来获得最大得分。
  2. 对函数递归调用的掌握,通过递归的方式遍历所有可能的移动情况。
  3. 对奇偶性判断和处理的能力,根据数字的奇偶性做出不同的决策。
  4. 对缓存装饰器的运用,优化函数的性能,避免重复计算。

从这道题中可以学到

  1. 深入理解动态规划的解题思路,学会如何定义状态和状态转移方程来解决最优解问题。
    • 例如,通过定义 dp[i][0] 和 dp[i][1] 来表示不同奇偶性下的最大得分。
  2. 掌握递归函数的设计和编写,清晰地定义递归的终止条件和递归逻辑。
    • 像本题中的 dfs 函数,通过递归探索所有可能的位置移动情况。
  3. 提升对数字奇偶性的处理能力,灵活运用奇偶性来制定策略。
    • 依据数字的奇偶性决定是否扣除分数 x 。
  4. 认识到缓存装饰器的作用和优势,学会在适当的场景中运用缓存来提高程序的效率。
    • 利用 @cache 避免重复计算相同参数的 dfs 结果。

“所谓宿命,其实都是最好的安排。”——《将夜》 

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

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

相关文章

JavaSE---类和对象(上)

1. 面向对象的初步认知 1.1 什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。 面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。用面向对象…

如何用R语言ggplot2画高水平期刊散点图

文章目录 前言一、数据集二、ggplot2画图1、全部代码2、细节拆分1&#xff09;导包2&#xff09;创建图形对象3&#xff09;主题设置4&#xff09;轴设置5&#xff09;图例设置6&#xff09;散点颜色7&#xff09;保存图片 前言 一、数据集 数据下载链接见文章顶部 处理前的数据…

搭建 Tomcat 集群【Nginx 负载均衡】

当我们想要提高后端服务器的并发性能&#xff0c;可以通过分配更多的资源给 Tomcat 服务器&#xff0c;但是这只能提高一部分的性能。因为每台 Tomcat 的服务器是有最大连接数为 200.所以即可拥有无穷无尽的内存&#xff0c;也会因为单台 Tomcat 的原因而无法发挥这些资源的最大…

grpc代理服务的实现(二)

目录 grpc service 的实现grpc服务通过unix域监听请求建立与代理服务的tcp连接请求转发到 unix 上代码地址 grpc service 的实现 假设 grpc service 的服务名是 Bar grpc服务通过unix域监听请求 go svr : grpc.NewServer() messages.RegisterBarServer(svr, bar.New()) reflec…

免杀笔记 ----> 后续更新安排

前一段时间&#xff0c;我疯狂更新了内网&#xff0c;本来想把NTLM-Relay给更上的&#xff0c;但是计划安排不允许了&#xff0c;之后后续再给大家进行深入的内网更新了&#xff01;&#xff01; &#xff1a;&#xff1a; 真不是我托更 嘻嘻嘻~~~ 说回正题&#xff0c;接下来…

算法体系-22 第二十二节:暴力递归到动态规划(四)

一 最小距离累加和 1.1 描述 给定一个二维数组matrix&#xff0c;一个人必须从左上角出发&#xff0c;最后到达右下角 沿途只可以向下或者向右走&#xff0c;沿途的数字都累加就是距离累加和 返回最小距离累加和 1.2 分析

把服务器上的镜像传到到公司内部私有harbor上,提高下载速度

一、登录 docker login https://harbor.cqxyy.net/ -u 账号 -p 密码 二、转移镜像 minio 2024.05版 # 指定tag docker tag minio/minio:RELEASE.2024-05-10T01-41-38Z harbor.cqxyy.net/customer-software/minio:RELEASE.2024-05-10T01-41-38Z# 推送镜像 docker push harbo…

陕西印刷平台的元宇宙之旅:打造创意印刷新纪元

在数字化时代的浪潮中&#xff0c;陕西印刷平台不断追求创新与卓越&#xff0c;将目光投向了新兴的元宇宙领域。作为传统印刷业的先行者&#xff0c;陕西印刷平台致力于将先进的元宇宙技术融入传统印刷之中&#xff0c;为品牌和个人提供独一无二的创意印刷解决方案。此刻&#…

学习笔记——交通安全分析04

目录 前言 当天学习笔记整理 交通行为、心理与安全 结束语 前言 #随着上一轮SPSS学习完成之后&#xff0c;本人又开始了新教材《交通安全分析》的学习 #整理过程不易&#xff0c;喜欢UP就点个免费的关注趴 #本期内容接上一期03笔记 #最近感觉有点懒&#xff0c;接受各位…

【AI应用探讨】— GPT-4o模型应用场景

目录 1. 自然语言处理&#xff08;NLP&#xff09;任务 文本生成 机器翻译 问答系统 2. 聊天机器人与虚拟助手 智能聊天机器人 虚拟助手与陪伴 3. 内容创作与辅助 创意写作 代码生成 4. 教育辅助 学习工具 5. 客户服务与支持 客户服务聊天机器人 技术支持 6. 研…

GitLab教程(六):通过rebase来合并commit

文章目录 1.理解和操作rebase&#xff08;1&#xff09;rebase的逻辑&#xff08;2&#xff09;实践演示 2.rebase的优缺点 1.理解和操作rebase &#xff08;1&#xff09;rebase的逻辑 Git Rebase的基本逻辑是将一个分支的更改移到另一个分支上&#xff0c;同时看起来好像这…

流批一体计算引擎-9-[Flink]中的数量窗与时间窗

1 数量窗 1.1 数量滚动窗口 0基础学习PyFlink——个数滚动窗口(Tumbling Count Windows) 1.1.1 代码分析 Tumbling Count Windows是指按元素个数计数的滚动窗口。 滚动窗口是指没有元素重叠的窗口。 (1)构造了一个KeyedStream&#xff0c;用于存储word_count_data中的数据。…

英伟达算法岗面试,问的贼专业。。。

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

接口返回的文字段落换行问题

接口返回的文字段落换行问题 解决方案&#xff1a;文本中包含\r\n, 使用v-html显示文本&#xff0c;并给便签添加&#xff1a;white-space: pre-wrap;

【Linux】Linux环境基础开发工具_6

文章目录 四、Linux环境基础开发工具gdb 未完待续 四、Linux环境基础开发工具 gdb 我们已经可以写代码了&#xff0c;也能够执行代码了&#xff0c;但是代码错了该如何调试呢&#xff1f;Linux中可以使用 gdb 工具进行调试。 我们写一个简单的程序&#xff1a; 但是我们尝试…

汇编:宏的使用

汇编语言中的宏是用于定义可重复使用的代码块或指令集合的强大工具。宏通过简化代码编写和提高可读性&#xff0c;使得编写和维护汇编程序更加方便&#xff1b;在 MASM&#xff08;Microsoft Macro Assembler&#xff09;中&#xff0c;宏的定义和使用非常常见。以下是对汇编语…

java面试题:springMVC的执行流程

请求到达前端控制器DispatcherServlet&#xff0c;该组件是SpringMVC的核心组件&#xff0c;负责接收所有的请求。 DispatcherServlet根据请求中的URL和HandlerMapping找到对应的Controller对象&#xff0c;HandlerMapping是一个接口&#xff0c;定义了请求的URL和对应的Contro…

【linux网络(三)】HTTP协议详解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux网络 1. 前言2. 序列化和…

定个小目标之刷LeetCode热题(16)

针对本题排序流程&#xff0c;主要是将链表拆分为长度为subLength的子链表1和子链表2&#xff0c;然后把子链表1和子链表2合并为一条有序链表&#xff0c;重复上述步骤直到把链表都拆分完&#xff0c;这样这条链表每段长度为2的子链表都是有序的&#xff0c;那么要整条链表有序…

学习ZYNQ——HLS

文章目录 前言一、HLS是什么&#xff1f;二、HLS开发流程三、HLS工程创建四、代码编写1.led.h2.led.cpp3.test_led.cpp 五、C仿真与C综合六、联合仿真七、添加ap_int.h八、再次进行C仿真的Cosimulation九、导出IP核的时候出现报错&#xff1a; 前言 本文主要记录自己学习HLS的…