Loading [MathJax]/jax/output/CommonHTML/jax.js

目次

モノグサプログラミングコンテスト2024(AtCoder Beginner Contest 345)E 問題メモ

モノグサプログラミングコンテスト2024(AtCoder Beginner Contest 345)

E - Colorful Subsequence

E - Colorful Subsequence

問題

解法

まず、以下のDPを考える。

以下のように求められる。
便宜的に、0番目に色がどれとも異なり価値は0のボールがあり、それは必ず使用すると考える。

  i→
j   | 0  1  2  3  4  5  6
↓--+---------------------
  0 | 0     @
  1 | -        @
  2 | -  -        @
  3 | -  -  -        @ [*]
  4 | -  -  -  -

DP[6,3] を求める場合、@ をつけた DP[5,3],DP[4,2],... の中で、 かつ「iCiC6」である中での最大値に、V6 を加えたものとなる。

これを愚直に求めると、O(NK) のマスそれぞれの遷移に O(K) かかり、O(NK2) となり間に合わない。

高速化

更新の際に参照するのは、常にナナメに並ぶ要素であることを利用する。

添字 * は、その添字の範囲全体を指すとする。

DP[6,3] を求める場合、DP2[5,3,] を参照し、 DP2[5,3,1]C6 と同じなら DP2[5,3,2] を、異なれば DP1[5,3,0] を使えばよい。

そして、新しい DP[6,] をもって、DP2[6,] を求める。
この時に DP[6,3] と比較するのは DP2[5,2,] であり、答えを求める際に使用した DP2[5,3,] とは1段ずれる点に注意。

これで遷移が O(1) となり、O(NK) で間に合うようになる。

Python3