L - 猫 解説
by
AngrySadEight
\(i\) 番目の猫までを配置したとき,\(i\) 番目までの猫から距離が \(1\) 以内である猫の中で最も番号の小さいものが \(j\) であるとします.このとき,\(i + 1\) 番目の猫から距離が \(1\) 以内である猫の中で最も番号の小さいもの \(k\) について,\(k \geq j\) である必要があり,また \(k \geq j\) であるならばそのような配置は可能です.(理由:\(j = k\) であるならば,猫 \(i\) を「ほんのわずかに」(すなわち,猫 \(i - 1\) を追い抜かさず,かつ猫 \(j - 1\) と猫 \(i\) との距離が \(1\) 以内にならないような範囲で) 左に寄せたのちに猫 \(i + 1\) を元々猫 \(i\) のいた場所に配置すればよく,\(k \geq j\) ならば猫 \(j\) からちょうど距離 \(1\) である位置に猫 \(i + 1\) を配置すればよい)これにより,次の DP を考えます.
- \(dp[i][j] = \)(\(i\) 番目までの猫までを配置したとき,\(i\) 番目までの猫と距離 \(1\) 以内にいる猫の中で最も番号の小さいものが \(j\) である場合の,幸福度の総和の最大値)
この DP は次のように遷移可能です.
- \(dp[i + 1][j] = \max_{j \geq k} (dp[i][k]) + \sum_{j \leq l \leq i + 1}f_{i + 1, l}\)
\(2\) 項目は前計算として累積和を求めておくことで ,遷移 \(1\) 回あたり \(O(1)\) で,\(1\) 項目は区間最大値を求めるセグメント木を用いることで遷移 \(1\) 回あたり \(O(\log N)\) でできます.したがって,この DP は全体で \(O(N^2 \log N)\) で動作します.
投稿日時:
最終更新:
