首页 > 其他分享 >[ABC176F] Brave CHAIN

[ABC176F] Brave CHAIN

时间:2024-09-28 16:45:30浏览次数:11  
标签:得分 留下 Brave 数字 CHAIN 复杂度 ABC176F 剩下 转移

[ABC176F] Brave CHAIN

题意

给你 \(3n\) 个数字。每次你可以选取前 \(5\) 个数字,拿走里面任意三个数字,剩下两个,如果拿走的 \(3\) 个数字相等,得分 \(+1\)。问最大得分是多少。

思路

首先我们想尝试贪心。然而不好贪心,因为你不知道前面会给你留下哪两张牌,留下的方案数很多。

题目可以看做每次有三个新数字,和前面两个留下的数字进行操作,它们中留下两个。

此时可以考虑 DP。由前面思考或者部分分提示可以设出 \(dp_{i,x,y}\) 表示考虑到第 \(i\) 组数字(\(3\) 个为一组),留下 \(x,y\) 的最大分数。

于是我们要枚举前面留下哪两个数字,五个数字中留下哪两个数字,状态是 \(O(nV^2)\),转移考虑一下留下哪两个数字,是常数复杂度,总共 \(O(nv^2)\)。

考虑如何优化。

首先枚举 \(i\) 是必须的,不过空间上可以把这一维滚掉。状态感觉都很有用。

考虑优化转移。分为得分和不得分两种情况考虑,这样代码好写一些吧。设新的三个数字为 \(a,b,c\)。若 \(a=b=c\),我们直接删除这三个数字得分 \(+1\),且这样是一定不劣的。反正它们迟早都要删掉,就不必留到后面了。因此这种情况全局 \(+1\),可以维护一个 \(tag\)。虽然存在不得分的更新方式,但是根据贪心,我们最后的最大得分方案中一定没有把这三个新数留下的情况,这是不优的,因此这种情况不用考虑不得分的转移。

若 \(a,b,c\) 有两个相等,设 \(a=b\)。可以在前面找一个 \(x=a=b,y\in[1,n]\),进行转移,剩下的牌就是 \(c,y\),得分 \(+1\)。也可以在前面找 \(x=y=c\),剩下 \(a,b\),得分 \(+1\)。

若 \(a,b,c\) 互不相同,可以在前面找 \(x=y=a \ or \ b \ or \ c\),这里假设选择了 \(a\)。那么剩下的是 \(b,c\),得分 \(+1\)。

以上转移都是 \(O(n)\) 或 \(O(1)\) 的。下面讨论不得分的情况。

为了方便,不得分的情况可以不用考虑 \(a,b,c\) 相等的情况。虽然这样可能会把得分的情况算入不得分,但由于我们的 \(dp\) 值是取 \(\max\),所以没有关系。

若新数留下两个假设是 \(a,b\),那么剩下状态是 \(a,b\),得分不变。得分等于 \(x,y\) 任取的最大值,可以在上一层 \(dp\) 顺便维护,时间复杂度是 \(O(1)\) 的。

若剩下 \(a,x\),则剩下状态为 \(a,x\),我们必须枚举 \(x\),毕竟它是目前一层的状态。然后对所有可能的 \(y\in[1,n]\) 取最大值,这个也可以在上一层 DP 的时候顺便维护。时间复杂度 \(O(n)\)。

若剩下 \(x,y\),则我们要枚举所有 \(x,y\),因为这是状态。但是你发现上面所有的转移都最多只有 \(O(n)\),而且这个转移极为美丽,它是由 \(x,y\to x,y\) 的。一个小技巧是把上面的转移用临时数组存下来,只有 \(O(n)\) 个,做完上面转移后直接把数组盖到原 DP 数组上,这样我们就不用 copy 一遍 \(n^2\) 的 DP 数组了。

总时间复杂度 \(O(n^2)\)。

标签:得分,留下,Brave,数字,CHAIN,复杂度,ABC176F,剩下,转移
From: https://www.cnblogs.com/liyixin0514/p/18438129

相关文章

  • 基于 LangChain 的自动化测试用例的生成与执行
    在前面的章节中,分别介绍了Web、App、接口自动化测试用例的生成。但是在前文中实现的效果均为在控制台打印自动化测试的用例。用例需要手动粘贴,调整之后再执行。那么其实这个手动粘贴、执行的过程,也是可以直接通过人工智能完成的。应用价值通过人工智能代替人工操作的部分,节省时间,......
  • 基于 LangChain 的自动化测试用例的生成与执行
    在前面的章节中,分别介绍了Web、App、接口自动化测试用例的生成。但是在前文中实现的效果均为在控制台打印自动化测试的用例。用例需要手动粘贴,调整之后再执行。那么其实这个手动粘贴、执行的过程,也是可以直接通过人工智能完成的。应用价值通过人工智能代替人工操作的部分,节省......
  • 基于 LangChain 的自动化测试用例的生成与执行
    在前面的章节中,分别介绍了Web、App、接口自动化测试用例的生成。但是在前文中实现的效果均为在控制台打印自动化测试的用例。用例需要手动粘贴,调整之后再执行。那么其实这个手动粘贴、执行的过程,也是可以直接通过人工智能完成的。应用价值通过人工智能代替人工操作的部分,节省时间,......
  • java 如何像 js 一样使用 ?( optional chaining operator)
    在Java中,没有像JavaScript中的可选链操作符(optionalchainingoperator)一样的语法。但是,可以使用Java8中引入的Optional类来实现类似的功能。假设我们有一个包含嵌套对象的类:publicclassMyClass{privateMyOtherClassmyOtherClass;//gettersandsetter......
  • 【论文阅读】ChainedDiffuser: Unifying Trajectory Diffusion and Keypose Predictio
    Abstract我们提出了chaineddiffuser,这是一种policy架构,它结合了动作键预测和轨迹扩散生成,用于从演示中学习机器人操作。我们的主要创新是使用全局基于转换器的动作预测器来预测关键帧的动作,这是一项需要多模态语义场景理解的任务,并使用局部轨迹扩散器来预测连接预测宏动作的轨......
  • 2025秋招LLM大模型多模态面试题(八)- langchain完整面试题
    目录什么是LangChainLangChain包含哪些核心模块模型输入/输出(ModelI/O)组件管理数据处理链式组合记忆与上下文管理外部集成一些核心概念什么是LangChainAgent?什么是LangChainmodel?LangChain包含哪些特点?LangChain如何使用?LangChain如何调用......
  • RAG技术全面解析:Langchain4j如何实现智能问答的跨越式进化?
    LLM的知识仅限于其训练数据。如希望使LLM了解特定领域的知识或专有数据,可:使用本节介绍的RAG使用你的数据对LLM进行微调结合使用RAG和微调1啥是RAG?RAG是一种在将提示词发送给LLM之前,从你的数据中找到并注入相关信息的方式。这样,LLM希望能获得相关的信息并利用......
  • 漂亮师娘守寡多年终究耐不住寂寞与徒弟一起学习AI大模型应用【LangChain+LlamaIndex+A
    上节传送门: 三只羊女主播狂欢自学AI大模型应用开发却换来嘲讽,回复:我有更多优点——理论开篇-CSDN博客文章浏览阅读944次,点赞19次,收藏6次。33岁丰腴女自学AI大模型应用开发却换来嘲讽,回复:我有更多优点——导论——1-CSDN博客这也是我这么多年来的一个心得和实际的体会,以后的日......
  • 使用LangChain4J实现Agent与Tool调用
    一些LLM除了生成文本,还可触发操作。所有支持tools的LLMs可在此处找到(参见“Tools”栏)。有一个被称为“工具(tools)”或“函数调用(functioncalling)”的概念。它允许LLM在必要时调用一或多个由开发者定义的工具。工具可以是任何东西:网页搜索、外部API调用、或执行一段特定代码等......
  • Chainlit集成LlamaIndex实现知识库高级检索(简单融合寻回器)
    检索原理**简单融合寻回器**简单融合寻回原理,是利用多个检索器,融合查询最终的结果返回给LLM。此检索器还将通过生成与原始问题相关的问题,用相关问题再次检索多个检索器的数据,把原始问题和相关问题经过多个检索器检索结果整理后交给LLM最最终回复。本次代码示例中,使用简......