AOJ 2611 - 順位付け
解法
木の2乗DPとかなんとか言われてるやつです。
問題文をじっくり読むと、入力が木になっていて、そのなかで順位付けをしていくことがわかります。木全体の根は、入力時点で一番高さが高かった頂点です。
木の高さがすべて異なる場合は簡単に求めることができますが、同じ高さの場合があるのでさっと解くことはできません。
以下のようなDPを考えます。
- を根とする部分木について、高さの種類数がとなるようにしたときの、高さの決め方
頂点が葉だった場合は、となります。
それ以外の場合、子についてそれぞれ探索してから、自分自身にマージしていくことを考えます。
子についていくつか見た後の、現時点での値(高さが種類となるようなパターン数)
ここに、達をマージしていきます。は、今見ている子です。
とを組み合わせると、
新たな種類数はの区間のいずれかの値になります。
新たな種類数がになるパターンを考えます。
種類を組み合わせて種類にする際、
- 種類の中から、個を選び、側の高さを全て割り振る
という操作をまず行うと、種類の中から、すでに選択された個と、まだ選択されていない個にわかれます。
ここから、個の頂点に高さを割り当てなければなりませんが、この中で、個は残りの個のいずれかが選ばないといけないので無視します。
ということで、残った個の中から、個を選び、に割り当てる必要があります。
割り振る場所を決めてしまうと、順番は一意に決まるので、最終的に、種類を組み合わせて種類を作成する際のパターン数は、
通りです。
ということで、ここにをかけたものを、新たに足しこめばよいです。
このようにして、とを組み合わせて新たなを作成、という操作を繰り返します。
その後、最終的なについて、とすればよいです。今見ている頂点自身を種類数に加えるためです。
計算量についてですが、一見かかるように見えますが、一番内側のループ以外が合わせてになるみたいです。
詳しい解析はこちらを参照してください。