Kazun の競プロ記録

競技プログラミングに関する様々な話題を執筆します.

AtCoder Beginner Contest 280 E問題 Critical Hit

問題

atcoder.jp

提出解答

atcoder.jp

問題の概要

体力が  H のモンスターがいる.

このモンスターに1回攻撃すると,  P % の確率で体力が  2 減り,  (100-P) % の確率で体力が  1 減ることのどちらか一方のみが起こる.

モンスターの体力が  0 以下になるまでに行う攻撃回数の期待値を求めよ.

制約

  •  1 \leq N \leq 2 \times 10^5
  •  0 \leq P \leq 100

解法

動的計画法で解くことにする.  H=-1,0,1,2, \dots, N に対して,  {\rm DP}[H] を以下で定義する.

  • モンスターの体力が  H の状態から体力を  0 以下にするまでに行う攻撃回数の期待値

ベースケースとして,  {\rm DP}[-1]={\rm DP}[0]=0 である.

更新式について,  H \geq 1 とする. このとき, 1回攻撃を行うと, 次のようになる.

  •  P %の確率で体力が  (H-2) の状態になる.
  •  (100-P) % の確率で体力が  (H-1) の状態になる.

このことから,

 {\rm DP}[H]=\dfrac{P}{100} {\rm DP}[H-2]+ \left(1- \dfrac{P}{100} \right) {\rm DP}[H-1]+1

となることがわかった.

この更新式によって, 最終的な解答は  {\rm DP}[N] であり, 上の更新式を用いることによって,  O(N) 時間で求めることができた.