競技プログラミング用 知識集積所

ABC421E - Yacht

最終更新:

sport_programming

- view
管理者のみ編集可


問題


必要知識

B以下レベルの内容は省略

考え方

n回目の結果を見てn+1回目の行動を決めるあたり、露骨に動的計画法
問題は、DPテーブルとして何のデータをもつか。
値のほうは「その状況での期待値」だとしても、キーの方を何にするかが難しい。
「各目が何個キープ済か」をキーにするのが要素数最小にはなるだろうが、次の段階での計算がややしづらい。

そこで、サイコロ1つごとに
  • 事前にその目が出ていて、キープ済(6通り)
  • 今回その目が出た(6通り)
  • まだ目が確定していない
の13個の状態を定義することにする。
これを使って、残りサイコロ回数4通り*(13通りの状態)^5の約150万要素をもつ6次元vector※としてしまえばよい。

DPテーブル埋めは、
  • 残り0回のところは、map※などを用いて愚直に点数を計算する
    • 「今回出た」や「未確定」があるところは、最後の1回でもキープしなかったという状況なので0点でいい
  • 残り1回以上のところは、
    • 「未確定」がある場合、そのサイコロで各目が出た場合6通りの期待値の平均
    • それ以外は、「今回出た」のところを「キープして/せずに進む」の2択*最大5セットで前の情報を見て全探索し、期待値の最大値を探す
で埋めることができる。

キープする/しないの選択も加味しても、6^5+19^5*3のおよそ740万回のループでテーブルが埋まる。
ただ、このアイデアをそのまま実装すると、11重ループ※になるので、考えどころではあるかもしれない。

解答例


注意点


別解

タグ:

動的計画法
ウィキ募集バナー