Alien DP をざっくり理解する

Alien DP という名前は Twitter でたまに見かけますが、その詳しい内容を調べようとしてもなかなか大変だったので備忘録もかねてここに書いておきます。

Alien DP は ABC で出題されており、その解説で詳しい説明がなされているのでネタバレをされてもよい方はそちらも参照すると良いでしょう。

数理的な詳しい解説は Monge グラフ上の $d$-辺最短路長を計算するアルゴリズム | Kyopro Encyclopedia of Algorithms になされているので、本記事では正当性の証明などは避けて直感的にどのようなアルゴリズムであるかを理解することを目標とします。

Alien DPで解ける問題

Alien DPは次のようなことができるアルゴリズムです。

 x = 0, 1, 2,\dots, Nとする。  f(x)が下に凸である。つまり任意の x\le N-2に対して f(x+1) - f(x) \ge f(x+2) - f(x+1)が成立するとする。 もし任意の定数 cに対して \min_{x =  0, 1, 2,\dots, N}{(f(x) - cx)} \Theta(\alpha)で計算できるなら 任意の k = 0, 1, 2,\dots, Nに対して f(k) \Theta(\alpha\log max(f(x+1) - f(x)))で計算できる。

 f(k)より \min_{x =  0, 1, 2,\dots, N}{(f(x) - cx)}を高速に計算できる場面がぱっと思いつかないかもしれません。 例えば、長さ Nの配列に対し、そのうち k個の要素を使った最適化をするために dp[i][j] = \{i番目までにj個の要素を使ったときの最適値\}とするようなdpをしたいがそのままでは \Theta(N^2)で間に合わないときが考えられます。*1

アルゴリズム

 \min_{x =  0, 1, 2,\dots, N}{(f(x) - cx)}を求める操作は y = f(x)のグラフと傾き cの直線が接するときの接点を求める操作に対応します。 これは傾き cの直線の式を y = cx + bとおいて、 y = f(x)との交点をもつようにしながら bを最小化していると考えるとよいです。

この接点の x座標は cに対して単調増加なので、接点が (k, f(k))に来るような cの値を二分探索すればよいです。 接点が cの右か左かは cを少しずらして計算することで判定することが可能です。

注意すべきこと

下の図のように y=f(x)のグラフと直線の交点は1点とならない場合があります。 そのため二分探索の分岐条件を考えるときは気をつけなければなりません。

更新履歴

2022/05/30 @noshi91さんからのご指摘を受け一部修正しました

*1:このように多くの場面ではdpによってこれをなしているのでAlien "dp"ですね