解説
前提:「コストCkを支払う」を「満足度に−Ckが加算される」と読み替えます。
以下のようなDPで解くことができます:
dp[時刻][レストラン or 病院][現在罹っている毒]=幸福度の最大値
遷移は以下が考えられます:
- レストランに居て毒k入りの料理を食べる場合:
- 毒kに罹っている場合は、現在の幸福度にAiを足し、[現在罹っている毒]からkを取り除いて次の時刻の病院に移動する。
- 毒kに罹っていない場合は、現在の幸福度にAiを足し、[現在罹っている毒]にkを追加して次の時刻に移動する。
- レストランに居て、解毒剤k入りの料理を食べる場合は、[現在罹っている毒]からkを取り除いて次の時刻に移動する。
- 病院に居る場合:
- 毒を治療せずに次の時刻のレストランに移動する。
- それぞれの毒kに対して:
- 幸福度からCkを引いたうえで[現在罹っている毒]からkを取り除き、次の時刻に移動する。
計算量はO(NK2k)です。[現在罹っている毒]はbitで管理するとよいでしょう(bitDP)。
実装例(Ruby、726ms)
余談:もともとK≤10でしたが、Rubyで通らなかったので8まで縮めました。YJITをください