目次

モノグサプログラミングコンテスト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],...$ の中で、 かつ「$i$ が $C_i \neq C_6$」である中での最大値に、$V_6$ を加えたものとなる。

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

高速化

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

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

$DP[6,3]$ を求める場合、$DP2[5,3,*]$ を参照し、 $DP2[5,3,1]$ が $C_6$ と同じなら $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