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

news2025/6/26 5:55:09
  • 博客主页:誓则盟约
  • 系列专栏: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:
        @cache
        def dfs(i,j):
            if i == len(nums): return 0
            if 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.coloradmin.cn/o/1822857.html

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

相关文章

【docker】Linux安装最新版Docker完整教程

这里写目录标题 一、安装前准备工作1.1、安装依赖包1.2、设置阿里云镜像源 二、安装Docker2.1、docker-ce安装2.2、启动docker2.3、启动docker并设置开机自启 三、 优化docker配置3.1、访问阿里云官方镜像加速器地址3.2、设置阿里云加速地址 一、安装前准备工作 1.1、安装依赖…

AI应用工具箱|AIGC聚集地

1、AI应用工具箱|AIGC聚集地 https://www.yuque.com/popponyj/aigc_aitools

使用Python和Matplotlib绘制复杂数学函数图像

本文介绍了如何使用Python编程语言和Matplotlib库来绘制复杂的数学函数图像。通过引入NumPy库的数学函数,我们可以处理包括指数函数在内的各种复杂表达式。本文详细讲解了如何设置中文字体以确保在图像中正确显示中文标题和标签,并提供了一个完整的代码示例,用户可以通过输入…

【AI基础】概览

一、目的 主要梳理一下大模型的相关概念&#xff0c;并在此基础上&#xff0c;部署安装最基础的AI运行环境&#xff0c;以达到输出AI领域的helloworld。 总的来说如图&#xff1a; 按照从下往上的顺序来理解&#xff0c;也是从下到上的顺序来安装部署。 规则1 注意每个层级的…

AI大模型探索之路-实战篇:智能化IT领域搜索引擎之知乎网站数据获取(初步实践)

系列篇章&#x1f4a5; No.文章1AI大模型探索之路-实战篇&#xff1a;智能化IT领域搜索引擎的构建与初步实践2AI大模型探索之路-实战篇&#xff1a;智能化IT领域搜索引擎之GLM-4大模型技术的实践探索3AI大模型探索之路-实战篇&#xff1a;智能化IT领域搜索引擎之知乎网站数据获…

SpringMVC01-初始SpringMVC

SpringMVC 回顾MVC 什么是MVC MVC是模型(Model)、视图(View)、控制器(Controller)的简写&#xff0c;是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码。MVC主要作用是降低了视图与业务逻辑间的双向偶合。MVC不是一种设计模式&#xff0c;MVC是一种架构模…

石化加工vr中毒窒息事故培训系统开发降低了培训成本和风险。

化工行业是工伤预防工作的重点领域之一&#xff0c;工伤预防及安全生产整治工作任务艰巨、责任重大。为进一步强化红线意识、底线思维&#xff0c;深圳VR公司研发的化工VR事故警示教育系统&#xff0c;以其独特的沉浸式体验&#xff0c;为员工的安全教育开辟了新的道路。目前化…

【算法题解】关于DFS的经典题目与分析

目录 1. 全排列问题2. n皇后问题3. 递归实现指数型枚举4. 递归实现组合型枚举5. 数水坑6. 打死我也不说7. 字母顺序归位8. 不同路径数 1. 全排列问题 题目链接 #include<iostream> using namespace std; const int N10;int n; int path[N];//存储 bool st[N];//状态数…

基于SSM框架的电影院售票网站

开头语&#xff1a; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果您对我们的电影院售票网站感兴趣或者有相关需求&#xff0c;欢迎通过文末的联系方式与我联系。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM框架 工具&#xff1a;ID…

【 EI会议 | 西南大学主办 | 往届均已实现检索】第三届神经形态计算国际会议(ICNC 2024)

第三届神经形态计算国际会议&#xff08;ICNC 2024) 2024 3rd International Conference on Neuromorphic Computing (ICNC 2024) 一、重要信息 大会官网&#xff1a;www.ic-nc.org&#xff08;点击投稿/参会/了解会议详情&#xff09; 会议时间&#xff1a;2024年12月13-15…

for 、while循环

练习1&#xff1a;输入一个数&#xff0c;判断是否是完美数 完美数&#xff1a;正序和逆序的结果一致 练习2&#xff1a; * ** *** **** 练习3&#xff1a; **** *** ** * 练习4&#xff1a;输入一个数&#xff0c;计算最大公约数&#xff0c;以及最小公倍数 练习5&#xff…

Git代码冲突原理与三路合并算法

Git代码冲突原理 Git合并文件是以行为单位进行一行一行合并的&#xff0c;但是有些时候并不是两行内容不一样Git就会报冲突&#xff0c;这是因为Git会帮助我们进行分析得出哪个结果是我们所期望的最终结果。而这个分析依据就是三路合并算法。当然&#xff0c;三路合并算法并不…

Python第二语言(十四、高阶基础)

目录 1. 闭包 1.1 使用闭包注意事项 1.2 小结 2. 装饰器&#xff1a;实际上也是一种闭包&#xff1b; 2.1 装饰器的写法&#xff08;闭包写法&#xff09; &#xff1a;基础写法&#xff0c;只是解释装饰器是怎么写的&#xff1b; 2.2 装饰器的语法糖写法&#xff1a;函数…

AMD核显推理Stable Diffusion

目标 近期&#xff0c;我开始了尝试使用Stable Diffusion进行文生图和。为此&#xff0c;我也尝试了多种在线服务&#xff0c;如WHEE。虽然在线平台能够提供不错的生成效果&#xff0c;但是生成的图片太多的话最终还是需要收费的。 因此我想尝试在本地部署SD模型进行图像生成。…

使用Leaflet库创建交互式地图:技术解析与实践

一&#xff1a;引言 在现代Web开发中&#xff0c;地图可视化已成为许多项目不可或缺的一部分。Leaflet是一个开源的JavaScript库&#xff0c;用于在Web页面上创建交互式地图。它简单易用、轻量级且高度可定制&#xff0c;使得开发者能够快速地创建出具有丰富功能的地图应用。本…

提升你的编程体验:自定义 PyCharm 背景图片

首先&#xff0c;打开 PyCharm 的设置菜单&#xff0c;点击菜单栏中的 File > Settings 来访问设置&#xff0c;也可以通过快捷键 CtrlAItS 打开设置。 然后点击Appearance & Behavior > Appearance。 找到Background image...左键双击进入。 Image:传入自己需要设置…

Unity引擎在UI上渲染粒子播放

大家好&#xff0c;我是阿赵。   在UI上面显示粒子特效&#xff0c;如果把粒子系统直接拖到Canvas里面&#xff0c;会存在很多问题&#xff0c;比如层级问题、裁剪问题等。这里分享一种用MaskableGraphic和UIVertex来显示粒子特效的方法。 一、 MaskableGraphic和UIVertex简…

数据结构和矩阵细节用法:double、cell和complex #matlab

矩阵建立 建立矩阵用[]&#xff1b; 矩阵的同一行内的元素用逗号或者空格隔开&#xff1b; 矩阵的不同行的元素用分号隔开 eg. 矩阵 A 1 2 3 4 5 6 7 8 9 在matlab中矩阵A表示为&#xff1a; clc;clear; A[1,2,3;4,5,6;7,8,9]; %或者A[1 2 3;4 5 …

SAP FI 批量显示科目余额 发生额的报表

实际界面 结果 源代码 *&---------------------------------------------------------------------* *& Report ZRPT_FICO_F01 *&---------------------------------------------------------------------* *& 20240614 批量显示余额 发生额 *&---------…

怎么批量去除EXCEL表格内时间?(已解决)

作为竞价优化师&#xff0c;经常碰到下载表格以后发现有冗余数据&#xff0c;这个时候我们该怎么快速处理呢&#xff01; 第一步&#xff0c;选择这一行数据 第二步&#xff0c;右击选择“单元格格式-日期” 第三步&#xff0c;选择日期中的2001-3-7格式&#xff0c;点击“确定…