[ABC303G] Bags Game 解题分析
1 题目大意#
1.1 题目翻译
有两个人轮流取物品。总共有 个物品,第 个物品的价值为 。
他们按照下面的其中一种方式取物品:
-
取出这一排物品最前面的或者最后面的。这一步没有代价。
-
设还剩下 个物品,那么重复取出 个物品,每次取出最前面的或者最后面的。这一步的代价为 。
-
设还剩下 个物品,那么重复取出 个物品,每次取出最前面的或者最后面的。这一步的代价为 。
最后一个人取出物品的价值为所有他取出物品价值之和减去他所花费的代价。问当两人均以最优策略取物品时,先手取出物品的价值减去后手取出物品的价值为多少。
1.2 数据范围
对于 的数据:
2 解法分析#
2.1 初见此题
首先,一看这道题,我们就会发现:不管怎么取物品,任何时刻的序列一定是原序列的一段连续子区间。所以,我们不难想到区间 DP。
2.2 暴力 DP
设 表示当前序列为原序列从第 个到第 个元素时,答案的最大值。那么,会有 种情况:
-
操作 1。此时,
-
操作 2。设 ,则:
- 当 时:
- 当 时:
-
操作 3。大致与操作 2 相同,这里就不过多叙述。
至此,我们完成了暴力 DP,时间复杂度为 ,显然过不了。
所以,接下来,我们就要考虑优化。
2.3 DP 优化
观察 DP 方程。我们发现,极限复杂度只出现在了操作 2 当 的情况。所以,我们把这个式子的 去掉,得:
我们发现, 可以前缀和 计算。设 为 到 的物品价值之和,于是得:
观察这个方程。我们把 视为未知数, 视为常数,则 为常数,可以提到 外面。所以,我们需要维护的只有:
发现这两个区间的长度都是 ,那么相当于只需要维护长度为 的 中最小的一个即可。
这有许多维护方法,比如优先队列,线段树,ST 表。
至此,这道题就完成了。时间复杂度为 或者
作者:DE_aemmprty
出处:https://www.cnblogs.com/aemmprty/p/17474719.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库