【问题标题】:Dynamic Programming Optimal Solution动态规划最优解
【发布时间】:2015-03-23 19:57:36
【问题描述】:

一家公司正在为其员工策划一个聚会。为每位员工分配了一个有趣的评级。 员工被组织成严格的等级制度,即一棵植根于总统的树。有一个 但是,在聚会的客人名单上的限制:员工及其直接主管 (树上的父母)不能都参加聚会。您希望为聚会准备一份宾客名单 最大化客人的趣味评分总和。表现出根据乐趣贪婪地选择客人 评级,不会工作。然后,制定一个动态规划解决方案

我无法理解某些条件,例如总统的有趣率高于他的后代,以及他的每个主管有多少员工。有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: algorithm dynamic-programming


    【解决方案1】:

    从问题的措辞来看,在层次树中分配给某人的乐趣评级不一定高于他们在层次树中的后代。

    但是,即使是这种情况,要看到选择最好的员工并不是最优的,请考虑一棵高度为 2 的树,其根为 fun=10,20 个子节点为 fun=1。那么最优解就是跳过贪心选择(根),选择20个孩子。

    无论如何,即使父母的乐趣不如他们的后代,也可以通过动态编程找到最佳解决方案。对于树中的节点 v,让 F(v) 是在以 v 为根的子树中可以获得的最大乐趣。然后选择 v 在这种情况下跳过子节点并查看以子节点为根的所有子树子树的最大乐趣之和(取这些子树的最大乐趣之和,并添加到乐趣(v)),或者您跳过 v,然后您获得的最大乐趣是所有以 v 的子树为根的子树的最大乐趣之和。这给出一种线性时间动态规划算法。

    【讨论】:

    • 就像一个有趣的补充:问题本质上是要求找到一组独立的最大权重,仅限于树。
    【解决方案2】:

    对于贪心的例子,展示一个简单的反例。

        1
        |
     1--3--1
        |
        1
    

    贪婪地选择,即首先选择 3 将不允许我们选择任何其他员工。但是如果我们不选择 3,那么 max 将是 4(全为 1)。所以贪婪的方法是行不通的。

    对于动态规划,我们可以将问题表述为选择给定的子树根。如果我们选择一个节点,那么它的任何子节点都不能被选择。但是,如果我们不选择节点,那么我们可以选择子节点或不选择子节点。

    for all v initialize
      c(v,true) = fun(v)
      c(v,false)= 0
    

    比使用下面的递归来解决问题

    weight(v,true)  = for all children sum( weight(ci,false) ) + fun(i)
    weight(v,false) = for all children sum( max(weight(ci,false), weight(ci,true)))
    

    答案将是max(weight(v,true),weight(v,false)) 用于根节点。

    【讨论】:

      猜你喜欢
      • 2012-11-24
      • 1970-01-01
      • 2018-03-17
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多