ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

Educational DP Contest / DP まとめコンテスト Q - Flowers

問題
提出コード

解法

とりあえず、最終的に残る花は、i \lt jかつh_{i} \lt h_{j}を満たすので、LISっぽいことを考えてみます。
dp[h_{i}] = 一番高さが高い(つまり右端)花の番号がiになるような並べ方の中での、美しさの総和の最大値
とします。
すると、次のような操作を、iが小さい方から行えばよいことがわかります。
i番目の花を見るとき、
dp[h_{i}] = a_{i} + max(dp[j]) (ただし、j \lt h_{i} )
となります。
区間[1,h_{i} )についてのdpの最大値は、dpの配列をRMQで表現することによって、高速に計算することができます。
あとはこのDPを解けば、この問題の答えがわかります。

感想

LISっぽいな、ということはわかってたのですが、最大値を計算する方法がわからずずっと悩んでいました。ただたんにRMQを使うだけでよかったのですね…
思考の流れとしては、まずi \lt jかつh_{i} \lt h_{j}を満たすような列を作成するので、LISが絡んでいそう、と目星を付けます。一番基本的なLISは二分探索を利用するので、まずは二分探索を考えますが、dp配列の添え字をh_{i}ベースにすると、中身が常に単調増加になっているわけではないので、二分探索は使えなさそう、という考えに至ります。そこで、ある区間に対する最大値を求める方法もしくはデータ構造はなんだろう、と考えたときに、セグメント木を利用すればいい!となり、あとはそれを利用することで、この問題が解けました。
結果的には、RMQをただ貼り付けるだけなので、あんまりDPっぽくは感じませんでした…