問題はこちら
問題概要
長さの数列に対して以下の操作を行うことでの任意の要素をにするときのコストが最小となるような操作列の数を求めよ.- を選びをにする.このとき,この操作を行う前の分だけコストがかかる.
また,とする.
解説
の大きい方から取っていくのがよさそう.実際,の降順に操作を行えば最小コストになる.ただし,とかだったらから操作をしてもいい.結局大事なのは隣り合う要素の大小関係で,- ならから操作を行う.
- ならから操作を行う.
- ならどちらから行ってもいい.
という条件を満たすような操作列を数え上げたい.(適当に有向辺を張ったグラフのトポロジカルソートの数え上げのようなもの)
の昇順にを左から並べていく(左のものから操作する).ここでは例としてを考える.
まず,を置く.
次にを置きたいが,であるための右側に置くしかない.この場合並べ方は次の通り.
次のはであるための左側に置く.置き方は次の2通り.
残りも同様になのではの右側,なのではの左側という風においていけばいい.
ここで重要になるのが,ある要素を置く方法の数を求めるのに必要なのがが今まで並べた要素のうち左から何番目に置かれているかという情報のみであるということ.これを状態として持ちながらDPできる.
を「まで並べて,が番目にあるような並べ方の数」とすると遷移は以下の様になる.
の遷移について説明する.
既にまで並べられている列の番目にを入れる.
このとき,を入れた後に「よりが左に置かれている」という条件が成り立つ必要があり,これが成り立っているようなものはが番目から番目にある列であるので,にはからの遷移がある.
他の遷移も同様に考えることができる.
これはいわゆる挿入DPというやつで順列の数え上げでよく使う.