sankantsuのブログ

技術メモ・競プロなど

ABC251 E - Takahashi and Animals 解説

atcoder.jp

以下のN個の行動がある.

  • 行動1: 動物1と動物2A_1円で餌をあげる
  • 行動2: 動物2と動物3A_2円で餌をあげる

    \vdots

  • 行動N: 動物Nと動物1A_N円で餌をあげる

すべての動物に餌をあげるための最小コストを計算したい.

少し観察すると,次の特徴がわかる.

  • 動物iに餌をあげるためには,行動 i\mathord-1 か行動 i の少なくとも一方は行う必要がある.

したがって,まず動物1に対して行動1か行動Nのどちらかによって餌を与えるか決め,さらに動物2,3と順に餌を与える方法を決めていく動的計画法で解けそうとわかる.

  • dp[0] [j] : 行動 Nを使って1,\ldots,j番目の動物に餌を与えるための最小コスト
  • dp[1] [j] : 行動 Nを使わずに1,\ldots,j番目の動物に餌を与えるための最小コスト

と定める.

動物jに餌を与える方法は行動 j\mathord-1 か行動 jのいずれかであるから,

\displaystyle dp [i] [j] = \min \{ dp [i] [j-2] + A[j-1] ,\, dp[i] [j-1] + A[j] \}

によって求められる.

行動 0 を使っていた場合にはすでに動物 N には餌を与えているので, dp [0] [N-1]  dp [1] [N] の小さいほうが答えである.

実装例

github.com

文章の説明と添字がずれているのと,テーブルの更新順が若干違うことに注意.