zoukankan      html  css  js  c++  java
  • 树形dp

     Usoperanto

    Problem's Link


     

    Mean: 

    给定n个单词,每个单词可以作为形容词来修饰其他单词.

    如果当前单词Wi修饰Wj,那么这个修饰的代价是:Wi~Wj之间的单词的总长度.

    你需要按照给定的修饰关系来安排单词的顺序,使得所有修饰代价的和最小.

    analyse:

    比赛时想到的是使用bfs+priority_queue来贪心,后来发现如果单词是嵌套的话,贪心就有问题.

    首先根据修饰关系来构图,注意这里应该是森林而不是树,这也是本题的一个trick.

    根结点不被任何结点修饰,叶结点不修饰任何结点.

    建好图以后,对于每一棵树,从叶结点开始向上dp.

    dp的策略:

    对于当前结点,把他的所有儿子排序,然后按照前缀和累加权值(除最后一个).

    然后把当前的结点所代表的子树打包(看成一个结点),累加子树的权值,往上传递.

    Time complexity: O(N)

     

    view code

     

  • 相关阅读:
    Android培训准备资料之Android开发环境的搭建
    第二十天
    第十九天
    第十八天
    第十七天
    第十六天
    第十四天
    第十三天
    十二天
    十一天
  • 原文地址:https://www.cnblogs.com/crazyacking/p/4853663.html
Copyright © 2011-2022 走看看