CF div2 1044 (D)
D
一道很有意思的 \(dp\) 题,非常符合现代 \(CF\) 的风格,但蒟蒻赛时还是没能做出来 \(qwq...\)
本题的操作看着非常复杂,需要分析出一些特殊性质:
首先分析一下使得第 \(i\) 只怪物掉血操作的可能性:只有 \(3\) 种:
- 直接 \(attack\) \(h_{i}\) 次。
- 在初始栈内直接杀死第 \(i-1\) 只怪物(直接指的是全部 \(attack\)),第 \(i\) 只怪物因掉落造成 \(i-1\) 点伤害。
- 若不是直接杀死第 \(i-1\) 只怪物,则第 \(i-1\) 只怪物一定承受过掉落带来的伤害。由题可知,因掉落而被伤害的怪物一定会在新形成的 \(stack\) 的栈底。因此,无论第 \(i-1\) 只怪物最终是怎么死的,它一定会在新栈的栈底。因此它死后,对第 \(i\) 只怪物造成的伤害一定是 \(1\) 点。
很显然,从上至下击杀怪物一定更优,因此击杀怪物的顺序也是固定的。考虑从前至后 \(dp\),决策第 \(i\) 只怪物的死亡方式:
- 直接 \(attack\) 致死:
\[dp_{i} = dp_{i-1} + h_{i}
\]
- 直接杀死第 \(i-1\) 只怪物,使第 \(i\) 只怪物受到 \(i-1\) 点伤害,若其存活再 \(attack\):
\[dp_{i} = dp_{i-2} + h_{i-1} + max(0, h_{i} - (i - 1))
\]
- 否则第 \(i-1\) 只怪物一定受到过掉落带来的伤害,在其死亡时一定位于栈底,对第 \(i\) 只怪物只会造成 \(1\) 点伤害:
\[dp_{i} = dp_{i-1} + h_{i} - 1
\]
显然第 \(1\) 个转移可以忽略,因为它一定没有第 \(3\) 个转移更优。
因此总转移式为:
\[dp_{i} = min(dp_{i-1} + h_{i} - 1, dp_{i-2} + h_{i-1} + max(0, h_{i} - (i - 1)))
\]
答案为 \(dp_{n}\)。