解説

階段を LL 段登る行動を何回連続で行ったかによって、その後に選べる行動が変わります。

そこで、dpi,jdp_{i,j} を「ii 段目にいるときの支払金額の最小値」とします。状態 jj は次を表します。

  • j=0j=0:肉離れをしておらず、直前に LL 段登る行動をしていない
  • j=1j=1:肉離れをしておらず、LL 段登る行動を 11 回連続で行った
  • j=2j=2:肉離れをしておらず、LL 段登る行動を 22 回連続で行った
  • j=3j=3:すでに肉離れをしている

初期状態は dp0,0=0dp_{0,0}=0 で、それ以外は十分大きい値とします。

11 段登る場合、肉離れをしていなければ連続回数は 00 に戻るため、j=0,1,2j=0,1,2 について dpi+1,0min(dpi+1,0,dpi,j+Ai+1)dp_{i+1,0}\leftarrow\min(dp_{i+1,0},dp_{i,j}+A_{i+1}) と更新します。

すでに肉離れをしている場合は、dpi+1,3min(dpi+1,3,dpi,3+Ai+1)dp_{i+1,3}\leftarrow\min(dp_{i+1,3},dp_{i,3}+A_{i+1}) と更新します。

LL 段登る場合、連続回数が 00 または 11 なら、j=0,1j=0,1 について dpi+L,j+1min(dpi+L,j+1,dpi,j+Ai+L)dp_{i+L,j+1}\leftarrow\min(dp_{i+L,j+1},dp_{i,j}+A_{i+L}) と更新します。

連続回数が 22 の状態からさらに LL 段登ると肉離れを起こすため、dpi+L,3min(dpi+L,3,dpi,2+Ai+L+K)dp_{i+L,3}\leftarrow\min(dp_{i+L,3},dp_{i,2}+A_{i+L}+K) と更新します。

肉離れをした後は、LL 段登る行動を選ぶことはできません。

以上の遷移を段数の小さい順に行えば、それぞれの状態に到達する最小金額を求められます。答えは min0j3dpN,j\min_{0\leq j\leq 3}dp_{N,j} です。

計算量

状態数は O(N)O(N) で、各状態からの遷移は定数個なので、計算量は O(N)O(N) です。