加载中...

CF div2 1044 (D)

D

一道很有意思的 \(dp\) 题,非常符合现代 \(CF\) 的风格,但蒟蒻赛时还是没能做出来 \(qwq...\)

本题的操作看着非常复杂,需要分析出一些特殊性质:

首先分析一下使得第 \(i\) 只怪物掉血操作的可能性:只有 \(3\) 种:

  1. 直接 \(attack\) \(h_{i}\) 次。
  2. 在初始栈内直接杀死第 \(i-1\) 只怪物(直接指的是全部 \(attack\)),第 \(i\) 只怪物因掉落造成 \(i-1\) 点伤害。
  3. 若不是直接杀死第 \(i-1\) 只怪物,则第 \(i-1\) 只怪物一定承受过掉落带来的伤害。由题可知,因掉落而被伤害的怪物一定会在新形成的 \(stack\) 的栈底。因此,无论第 \(i-1\) 只怪物最终是怎么死的,它一定会在新栈的栈底。因此它死后,对第 \(i\) 只怪物造成的伤害一定是 \(1\) 点。

很显然,从上至下击杀怪物一定更优,因此击杀怪物的顺序也是固定的。考虑从前至后 \(dp\),决策第 \(i\) 只怪物的死亡方式:

  1. 直接 \(attack\) 致死:

\[dp_{i} = dp_{i-1} + h_{i} \]

  1. 直接杀死第 \(i-1\) 只怪物,使第 \(i\) 只怪物受到 \(i-1\) 点伤害,若其存活再 \(attack\)

\[dp_{i} = dp_{i-2} + h_{i-1} + max(0, h_{i} - (i - 1)) \]

  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}\)

posted @ 2025-08-26 12:40  jxs123  阅读(8)  评论(0)    收藏  举报