Alien DP についてのメモ
Alien DPの自分なりの理解をメモ。
アルゴリズムの説明
を広義で上に凸であることがわかっている未知の数列とする。
与えられたに対して
を求めることを目指す。
とおくと、
が広義で上に凸であることから
は広義単調減少である。
この時関数を
、
で定義すると以下の補題が成り立つ。
の時、
である。
(ただし便宜上
とする)
証明
として、
に対し
を示す。
の時と
の時で場合分けする。
の時、
である。
の場合も同様。
(証明終)
上の補題から、全てのに対して
を満たす
が存在することがわかる。
また、 そのようなが取りうる範囲
は
が増加するごとに負の方向に移動する。
したがってが与えられた時、
となるような
を求めれば、
で
を求めることができる。
下の画像はの時の
のイメージ。
補足
が与えられた時に
がそれなりの速度(
とか)で求められる必要がある。
競プロでは
を「それぞれにスコアが与えられている何かの集合の中から(条件を満たしつつ)
個選んだ時のスコアの合計の最大値」のように定義した場合、すなわち
のような形の時、
と変形でき、DPでの値と、
となる
の値が簡単に求まることがある。
上の議論より、
が全て整数ならば
となるような整数
が存在することがわかる。
また、そのような
を二分探索する範囲は
を含むように取れば良い。*1
の場合、すなわち
の傾きが
で単調な場合、全ての
に対して
となる。
後述の問題例のように「を満たす最小の
を求める」ような場合に注意が必要となる。
下に凸な場合は
、
とおく。
問題例
公式解説より、「個のランプのうち隣り合う2つを選ばないように
個選ぶときのスコアの合計の最大値」を求める問題に帰着される。
提出→https://atcoder.jp/contests/abc218/submissions/42826600
素直にとして適用できる。
提出→https://atcoder.jp/contests/nadafes2022_day2/submissions/42869527
上の2つと異なり最小値を求める問題。
公式解説で「上の解説で説明した Alien DP の方法と同様に個数を持って DP して二分探索でも計算できますが、傾きが一定な部分の扱いで少し複雑になるので…」として省略されている二分探索を利用した解法で解いたので、それを紹介する。
を固定した時、
となる
と
が求められれば、何らかの
に対する
は求まることと、
の単調性を利用して二分探索すれば良いのだが、
となる
が複数存在する場合は注意が必要である。
最小値を求めるので、補足に書いたようにと置いていたとする。
この場合は と
から
の取りうる範囲を求め、最小値をとれば良い。
提出→https://atcoder.jp/contests/abc305/submissions/42870515
参考にさせていただいた記事
H - Red and Blue Lamps 解説 by Nyaan
Monge グラフ上の $d$-辺最短路長を計算するアルゴリズム | Kyopro Encyclopedia of Algorithms
*1:実際はを含んでいれば十分だが、両端のほうが目安をつけやすい