Usoperanto
Problem's Link
Mean:
给定n个单词,每个单词可以作为形容词来修饰其他单词.
如果当前单词Wi修饰Wj,那么这个修饰的代价是:Wi~Wj之间的单词的总长度.
你需要按照给定的修饰关系来安排单词的顺序,使得所有修饰代价的和最小.
analyse:
比赛时想到的是使用bfs+priority_queue来贪心,后来发现如果单词是嵌套的话,贪心就有问题.
首先根据修饰关系来构图,注意这里应该是森林而不是树,这也是本题的一个trick.
根结点不被任何结点修饰,叶结点不修饰任何结点.
建好图以后,对于每一棵树,从叶结点开始向上dp.
dp的策略:
对于当前结点,把他的所有儿子排序,然后按照前缀和累加权值(除最后一个).
然后把当前的结点所代表的子树打包(看成一个结点),累加子树的权值,往上传递.
Time complexity: O(N)