1 条题解
-
0
题解
思路
把用于“解锁”的卡牌按原下标从小到大排列。设已经用于解锁的卡牌数值之和为 ,那么原牌堆的前 张卡牌已经解锁。因而第 张卡牌能够继续用于解锁,当且仅当 。
若最终用于解锁的卡牌数值之和为 ,其余已经解锁的卡牌全部可以拿来得分,答案候选为
其中 。
做法
子集枚举
当 时,枚举哪些卡牌用于解锁,按下标检查每次选择时是否已经可达,再计算上述候选值。复杂度为 。
普通背包
令 表示是否能让用于解锁的卡牌数值之和恰为 。初始 。扫描到第 张卡牌时,只允许从 的状态转移到 。由于一次转移前 ,且 ,只需保留到 的状态。复杂度为 。
位集优化
把所有 压在一个位集中。删除下标小于 的源状态后,整体左移 位并取并集:
$$f\leftarrow f\;\mathbin{|}\;\bigl((f\gg(i-1))\ll(i-1+a_i)\bigr).$$每次转移处理 个机器字,总复杂度为 ,空间复杂度为 。
正确性说明
任何真实操作序列中的解锁卡牌都可以按原下标递增排列;在选择第 张解锁卡牌前,恰有原牌堆前 张卡牌可用,所以转移条件 必要。反过来,满足该条件的每次 DP 转移都对应一次当前已经解锁卡牌的合法解锁操作,因此 DP 中的每个状态也都可实现。
状态 可实现时,前 张卡牌均已解锁。除已计入 的解锁卡牌外,其余卡牌全部选择得分不会减少可达范围,所以候选值正是前缀和减去 。枚举所有可达 取最大值,即得到最优答案。
复杂度
满分算法的时间复杂度为 ,空间复杂度为 。子集枚举的时间复杂度为 ;普通背包的时间复杂度为 。
- 1
信息
- ID
- 1399
- 时间
- 3000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者