geam1113’s diary

主にAtcoderのコンテストの備忘録を書きます。AtCoder緑と水色を行ったり来たりしています。

AtCoder Beginner Contest 251 参加記録

コンテスト中AC:A〜C,E

E - Takahashi and Animals

グラフの問題として考えていたので、言い換えておきます。

頂点0,...,N-1について、頂点iと頂点(i+1)\ mod\ Nの間には辺iがあり、そのコストはA_iです。
ここから、以下の条件を満たすように辺をいくつか削除します。

  • すべての頂点の次数が1以上

残った辺のコストの総和をスコアとする時、スコアの最小値を求めてください。

辺がある時とない時で状態が2通りしかないので、iの小さい方から順にdpができないか考えます。

dp[i][j]:=iの状態がjの時のスコアの最小値。但し、
j=0の時、辺iは削除されている
j=1の時、辺iは残っている

遷移について、辺i-1番目が決定しているとして、辺iを考えます。

  • iを残す場合
    i-1は削除されていても残っていてもよいです。従って、
    dp[i][1]\leftarrow min(dp[i-1][0],dp[i-1][1])+A_i

  • iを削除する場合
    i-1は残っている必要があります。そうしないと、頂点iの次数が0になります、従って、
    dp[i][1]\leftarrow dp[i-1][1]

このように遷移していけば解けるかのように思えますが、例えば、i=0の時の初期値を

dp[0][1]\leftarrow A_0
dp[0][0]\leftarrow 0

として、i=2,...,N-1と更新していくとi=N-1で困ったことになります。というのも、

N-2が存在する場合でも、辺0が存在しない場合には辺N-1を残さなければならず、前述の遷移通りいきません。

これを解決するためには辺0が残っているかどうかの情報があれば良いので、DPテーブルに追加します。

dp[i][j][k]:=iの状態がjであり、かつ、辺0の状態がkの時のスコアの最小値。但し、
j=0の時、辺iは削除されている
j=1の時、辺iは残っている
k=0の時、辺0は削除されている
k=1の時、辺0は残っている

遷移は、k=0,1の両方の場合が必要になるだけで、先程と同じです。

0を初期値とします。
dp[0][0][0] \leftarrow 0
dp[0][1][1] \leftarrow A_0
dp[0][0][1] \leftarrow \infty
dp[0][1][0] \leftarrow \infty
としておきます。(dp[0][0][1],dp[0][1][0]は矛盾しており、あり得ない状況です。)

このDPを1,...,N-2まで順に更新します。
N-1の状態は、辺0,N-2の状態に従います。

  1. 辺のいずれか一方が削除されている場合
    頂点0,N-2の少なくとも一方は次数0なので、辺N-1は残す必要があります。よって、この時は、
    x_1 = min(dp[N-2][0][0],dp[N-2][0][1],dp[N-2][1][0])+A_i

  2. 辺の両方がある場合
    頂点0,N-2の両方とも次数が1なので、辺N-1は不要です。よって、この時は、
    x_2 = dp[N-2][1][1]

最終的な答えは、min(x_1,x_2)です。
提出コード