TDPC L - 猫
考え方
ABCでいうと、難しめD問題級。
わりと普通の動的計画法を、少し高速化するだけ。
DPテーブルとして、末尾の猫から左 $1$ 以内にいる猫の最小番号ごとの最大スコアの半分をもつ。
半分にするのは、距離 $1$ 以内にいるペアに両方同じ幸福値が加算されるところ、片方だけ処理するため。
そうしておいて、末尾に猫を $1$ 匹ずつ追加する。
猫 $i$ を追加したとき、そこから左 $1$ 以内にいる猫の最小番号が $j$ であるデータは、以下の和である。
- 猫が $i-1$ までだったときの、猫の最小番号が $j$ 以下での最大値
- 猫 $i$ と、猫 $j$ から $i-1$ までとの幸福度の合計
これらは両方とも累積的に処理できるため、猫 $1$ 匹の追加は $O(N)$ でできる。
よって、全体での計算量は $O(N^2)$ となる。
入力例1での動作
入力を受け取る。
n: 3
f:
{0, 2, 3}
{2, 0, -10}
{3, -10, 0}
以下では、猫を 0-indexed で扱う。
dp[j] は、末尾の猫から左 $1$ 以内にいる猫の最小番号が $j$ の場合の最大スコアの半分とする。
最初は全て $0$ である。
dp: {0, 0, 0}
猫 $0$ を追加しても、まだペアは存在しない。
dp: {0, 0, 0}
猫 $1$ を追加する。
猫 $0$ と猫 $1$ の幸福度は $2$ なので、更新後は次のようになる。
dp: {2, 0, 0}
次に猫 $2$ を追加する。
各 $j$ について、更新前の dp[0] から dp[j] までの最大値と、猫 $2$ から猫 $j$ 以降への幸福度の合計を足す。
| $j$ | 更新前の最大値 | 猫 $2$ との幸福度の合計 | 更新後の値 |
|---|---|---|---|
| $0$ | $2$ | $3+(-10)=-7$ | $2-7=-5$ |
| $1$ | $2$ | $-10$ | $2-10=-8$ |
| $2$ | $2$ | $0$ | $2$ |
したがって、最終的な DP テーブルは次のようになる。
dp: {-5, -8, 2}
最大値は $2$ である。
DP テーブルではスコアの半分を持っているので、$2$ 倍した $4$ が答え。
注意点
特になし。
別解
特になし。