题解:AT_keyence2021_e Greedy Ant
\text{Description}
共
在你行动时,你可以选择任意一个糖果取走,并获得这个糖果的美味值。
在蚂蚁行动时,蚂蚁会选择与他相邻的两个糖果的美味值最大的糖果,获得这个糖果的美味值。
求你最大能获得多少美味值。
\text{Solution}
蚂蚁的每次行动的操作是固定的,所以最终答案只受我们的影响。
因为贪心策略基本不可行,所以考虑 dp。
我们不难发现,蚂蚁只可能取到附近四个糖果,如何取到呢?设这些糖果从左到右依次为
我们发现 dp 的定义无从下手,分析题目后,我们考虑区间 DP,设
这种操作对答案没有影响,因为我们的这次操作如果这么选择就固定了,那么只需要在该操作即将影响蚂蚁时进行操作就不会影响答案。
我们又发现这种方式很难设计 dp,那么我们可以改为存储一次操作,这等价于没有将蚂蚁附近的糖果选择去选择其他糖果。
那么我们可以再依据新的想法设
接下来依据 dp 状态,再结合蚂蚁只可能取到附近四个糖果结论设计转移:
下文中
-
若我们选择了与蚂蚁相邻的糖果,分别考虑取蚂蚁左侧和右侧:
- 如果我们选择取左侧且蚂蚁左侧不为空,我们消耗存储的一次操作进行转移:
f_{l, r, k} = \max(f_{l, r, k}, f_{l - 1, r, k - 1} + a_{l}) 。 - 如果我们选择取右侧且蚂蚁右侧不为空,我们消耗存储的一次操作进行转移:
f_{l, r, k} = \max(f_{l, r, k}, f_{l, r + 1, k - 1} + a_{r}) 。
- 如果我们选择取左侧且蚂蚁左侧不为空,我们消耗存储的一次操作进行转移:
- 若我们不选择相邻的糖果,那么存储一步,判断蚂蚁选择左侧还是右侧。
- 若为左侧,那么转移到左侧:
f_{l, r, k} = \max(f_{l, r, k}, f_{l - 1, r, k + 1}) 。 - 否则转移到右侧:
f_{l, r, k} = \max(f_{l, r, k}, f_{l, r + 1, k + 1}) 。
- 若为左侧,那么转移到左侧:
区间 DP 枚举区间大小
时空复杂度
Accepted Code