難易度評価

難易度を1〜10段階で評価できます。投票はあとから変更・取り消しできます。

難易度(投票) 未投票 (0票)

投票の分布

まだ投票はありません。

  1. Lv.10票
  2. Lv.20票
  3. Lv.30票
  4. Lv.40票
  5. Lv.50票
  6. Lv.60票
  7. Lv.70票
  8. Lv.80票
  9. Lv.90票
  10. Lv.100票

難易度の目安を見る ↗

ログインして難易度を投票

外部サイトへ移動します

リンク先の URL を確認してから開いてください。

別タブで開く

Poisonous Full Course: Renewal

作成者 sevenc_nanashi

難易度(作成者設定) Lv.4

難易度(投票) 未投票 (0票)

実行時間制限
2 秒
メモリ制限
512 MiB

解説

前提:「コストCkC_kを支払う」を「満足度に−Ck-C_kが加算される」と読み替えます。

以下のようなDPで解くことができます:

dp[時刻][レストラン or 病院][現在罹っている毒]=幸福度の最大値dp[\text{時刻}][\text{レストラン or 病院}][\text{現在罹っている毒}] = \text{幸福度の最大値}

遷移は以下が考えられます:

  • レストランに居て毒kk入りの料理を食べる場合:
    • 毒kkに罹っている場合は、現在の幸福度にAiA_iを足し、[現在罹っている毒]\text{[現在罹っている毒]}からkkを取り除いて次の時刻の病院に移動する。
    • 毒kkに罹っていない場合は、現在の幸福度にAiA_iを足し、[現在罹っている毒]\text{[現在罹っている毒]}にkkを追加して次の時刻に移動する。
  • レストランに居て、解毒剤kk入りの料理を食べる場合は、[現在罹っている毒]\text{[現在罹っている毒]}からkkを取り除いて次の時刻に移動する。
  • 病院に居る場合:
    • 毒を治療せずに次の時刻のレストランに移動する。
    • それぞれの毒kkに対して:
      • 幸福度からCkC_kを引いたうえで[現在罹っている毒]\text{[現在罹っている毒]}からkkを取り除き、次の時刻に移動する。

計算量はO(NK2k)O(NK2^k)です。[現在罹っている毒][\text{現在罹っている毒}]はbitで管理するとよいでしょう(bitDP)。

実装例(Ruby、726ms)

余談:もともとK≤10K \leq 10でしたが、Rubyで通らなかったので8まで縮めました。YJITをください

ユーザー解説

ユーザー解説を書く

ユーザー解説はまだありません。