[ABC303G] Bags Game 解题分析

1 题目大意#

1.1 题目翻译

有两个人轮流取物品。总共有 n 个物品,第 i 个物品的价值为 wi

他们按照下面的其中一种方式取物品:

  • 取出这一排物品最前面的或者最后面的。这一步没有代价。

  • 设还剩下 m 个物品,那么重复取出 min(B,m) 个物品,每次取出最前面的或者最后面的。这一步的代价为 A

  • 设还剩下 m 个物品,那么重复取出 min(D,m) 个物品,每次取出最前面的或者最后面的。这一步的代价为 B

最后一个人取出物品的价值为所有他取出物品价值之和减去他所花费的代价。问当两人均以最优策略取物品时,先手取出物品的价值减去后手取出物品的价值为多少。

1.2 数据范围

对于 100% 的数据:

  • 1B,Dn3000

  • A,C109

2 解法分析#

2.1 初见此题

首先,一看这道题,我们就会发现:不管怎么取物品,任何时刻的序列一定是原序列的一段连续子区间。所以,我们不难想到区间 DP。

2.2 暴力 DP

fi,j 表示当前序列为原序列从第 i 个到第 j 个元素时,答案的最大值。那么,会有 3 种情况:

  • 操作 1。此时,fi,j=max(wifi+1,j,wjfi,j1)

  • 操作 2。设 l=ji+1,则:

    • Bl 时:

    fi,j=(ikjwk)A

    • B<l 时:

    fi,j=max0kl{(ipi+k1wp)+(jB+k+1pjwp)Cfi+k,jB+k}

  • 操作 3。大致与操作 2 相同,这里就不过多叙述。

至此,我们完成了暴力 DP,时间复杂度为 O(n3),显然过不了。

所以,接下来,我们就要考虑优化。

2.3 DP 优化

观察 DP 方程。我们发现,极限复杂度只出现在了操作 2 当 B<l 的情况。所以,我们把这个式子的 max 去掉,得:

(ipi+k1wp)+(jB+k+1pjwp)Cfi+k,jB+k

我们发现,(ipi+k1wp)+(jB+k+1pjwp) 可以前缀和 O(1) 计算。设 sl,rlr 的物品价值之和,于是得:

si+k,jB+kfi+k,jB+kC+si,j

观察这个方程。我们把 k 视为未知数,i,j 视为常数,则 si,jC 为常数,可以提到 max 外面。所以,我们需要维护的只有:

si+k,jB+k+fi+k,jB+k

发现这两个区间的长度都是 (jB+k)(i+k)=jiB,那么相当于只需要维护长度为 xfi,i+x1+si,i+x1 中最小的一个即可。

这有许多维护方法,比如优先队列,线段树,ST 表。

至此,这道题就完成了。时间复杂度为 O(n2) 或者 O(n2logn)

作者:DE_aemmprty

出处:https://www.cnblogs.com/aemmprty/p/17474719.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   DE_aemmprty  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示