Description:

ミサイルが様々な高度で順番に飛んでくる。
迎撃ミサイルは、ミサイルと同じ高度にいれば、ミサイルを破壊する事が出来るが、一度下げた高度を上げる事は出来ない。
最大ミサイルを何発破壊する事が可能か?
ミサイルの数は、32767発以下。

Answer:

どう見てもLIS(Longest Increasing Subsequesnce)と同型。
サイズn+1の配列vを用意する。
v[n]の値は、n個ミサイルを撃墜した時に保てる最高高度を意味する。
初期状態として、v[0]に無限大の値を、それ以外にはマイナス無限大を入れておく。
高さtのミサイルが飛んで来る度、v[n] >= tとなり、t[n+1]そのままこれを実装すると、O(n^2)で問題を解くことは出来るのだが、
1. v[0] >= v[1] >= ... >= v[n]が常に満たされる
2. v[n] >= t && v[n+1]の二つに気づけば、更新時のnをバイナリサーチで探す事が出来る為、O(n*log(n))で解ける。

Source: