邀请人参加聚会的最佳算法

时间:2014-11-12 15:11:55

标签: algorithm math tree hierarchy dynamic-programming

我是新来的,但在我的教科书中发现了问题。不幸的是它没有答案所以我想知道是否有人可以请求帮助。问题是:

  

您的任务是在公司内传播邀请。你只有   是时候与一定数量的人交谈,但如果你有保证的话   你邀请某人,他们会邀请他们的老板,那个人会   邀请他们的老板,等等,一直到CEO。你已经绘制出来了   整个公司的层次结构,并为每个人分配一个价值,   表明邀请他们的价值。鉴于此设置和   限制你可以与之交谈的人数,你想要计算最优   一组人邀请。一组最佳人将最大化总数   由您的选择直接或间接邀请的所有人的价值。

     

只有一个人,即CEO,在层次结构中没有老板。所有   其他人最终会在命令链上回答这个人,但不是   必须直接。

     

保证每个人最多只有一个老板,但是老板   可能还有另一个。例如,人A可能有老板B,老板是   C,老板是D,老板是CEO。因此影响人A会   自动影响B,C,D和首席执行官。

     

不同的员工可能在命令链中有共同的老板。你不   为不止一次影响一个人获得额外的价值。例如,如果   A和B都直接回答CEO,你会影响两者   收到val(A)+ val(B)+ val(CEO)的值,而不是val(A)+ val(B)+ 2val(CEO)。

     

给定正整数j,选择最终结果的j个人   总体价值最高。

我知道蛮力方法只是在列表中搜索最大值j次,但这不是很有用。我认为有一种动态的编程方法,但我的尝试并不总能提供正确的答案。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:5)

设V [e,k]是向e和e的直接和间接下属发出k个邀请的最大值,忽略e的所有直接和间接监督者的价值。如果员工e没有下属,那么基本案例是

V[e, k], k = 0 = 0
V[e, k], k > 0 = val(e).

如果员工e0有两个下属,e1和e2,那么重复是

V[e0, k], k = 0 = 0
V[e0, k], k > 0 = max over j of val(e0) + V[e1, j] + V[e2, k - j].

超过两名员工的天真卷积太慢了,所以我们必须卷入第一对,然后在其余部分进行卷积。我将省略细节。

答案 1 :(得分:1)

编辑:此答案假定邀请人的值均为非负值。

使用贪心算法可以解决这个问题。让我们先讨论价值观都相等的情况,所以我们只是试图邀请最多的人。关键的观察是,在任何最佳解决方案中,您应该总是挑选具有最多直接或间接上级的人。以下是对原因的简要说明:假设人X拥有最多的上级,并且您有一些不包括人X的选择。考虑您的选择中与Y共享最多上级的人X。然后,您可以选择X而不是Y来做得更好。

因此,在第一步中,我们总是可以贪婪地选择具有最高级别的人。然后,问题在几个较小的树上减少到相同的问题。例如,假设我们从以下树中选择3个被邀请者:

       A
   B       C
 D   E   F   G
H I J K L M N O

我们的第一个选择是H,它会自动为我们提供DBA。然后,仍然从三棵树中选择2

I   E      C
   J K   F   G
        L M N O

下一个最佳选择是L,依此类推。

我们可以有效地做到这一点,因为我们只需要跟踪每个节点的最深的孩子(不一定是直接孩子),我们可以事先计算出来。然后,我们需要某种优先级队列数据结构来选择最佳树。如果您从大小为k的层次结构中选择n人,则应该提供O(n + k log n)算法。

要将此扩展到值可能不相等的情况,基本上完全相同的想法是有效的,除了深度之外,您需要计算所有上级的总值。对于每个节点X,您可以跟踪YY之间路径上总值最大的子X

答案 2 :(得分:0)

听起来像graph problem。您可以使用连接组件的概念来实现此解决方案。

  • 第一次迭代将涵盖公司中的每个人,在那里您将确定CEO是谁以及谁在他下面。
  • 将首席执行官正下方的每位老板作为初始组件集。
  • 然后对于其他人,你将使用dfs将它们与二级boss相关联(这是动态方法)。
  • 你想以这样一种方式做最后一部分,如果person Fperson E的老板,而person D的老板又是person A的老板......低至{{1}},那么你想在dfs之后能够在O(1)时间内说出人F是人A的老板,反之亦然。

请记住为每个老板计算一个计数,其中计数将是他下面所有人的价值总和,并可选择跟踪人数。

最佳情况是你会发现链中的所有人都是较低的,否则算法应该在O(nk)中运行,其中k是从下到上的最大链