ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

Typical DP Contest J - ボール

問題
提出コード

解法

bitDPです。
期待値の考え方については、こちらの問題のおかげですんなりいきました。

ARC085 C - HSI - ツバサの備忘録

dp[S] = 座標においてある物の状態がSである場合に、そこから全ての物を倒すまでに投げるボールの回数の期待値
とします。座標は0~15までしかないので、このようなことができます。座標xに物が存在するとき、右からx+1番目のビットに1を立てます。すると、この状態は2^{x}で表現することができます。
さて、初期状態はdp[0]  = 0となります。
ある状態Sの際にボールをxめがけて投げると、x-1,x,x+1のどこかに物が存在していれば、倒すことができます。確率はすべて1/3なので、座標xにボールが落ちたときにSからS_{x}に遷移すると仮定すると、dp[S]は次のように表現することができます。
dp[S] = \frac{1}{3} (dp[S_{x-1}] + dp[S_{x}] + dp[S_{x+1}]) + 1
式変形すると、次のようになります。
3dp[S] = dp[S_{x-1}] + dp[S_{x}] + dp[S_{x+1}] + 3
さて、これを再帰なりなんなりを用いて、全てのxについて計算した上で最小値を求めればいいのですが、注意が必要です。
S_xが、実はSと同じ状態になる可能性があります。xに物が存在しなかった場合です。
例えば、x-1x+1には物が存在して、xには物が存在しなかった場合は、
3dp[S] = dp[S_{x-1}] + dp[S] + dp[S_{x+1}] + 3
となります。
これは、式変形をさらに行い、
2dp[S] = dp[S_{x-1}]  + dp[S_{x+1}] + 3
とすることができます。
また、x-1,x,x+1のどの場所にも物が存在しなかった場合、この式を適用することはできず、またそもそもこれが最適解になることはありえない(1回分無駄うちしていることになります)ので、スルーすることに注意しましょう。
あとは、このDPをうまく実装して、全てのxに対しての計算を行い、最小値を求めていけば、答えを求めることができます。