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:実際はを含んでいれば十分だが、両端のほうが目安をつけやすい