我是新来的,但在我的教科书中发现了问题。不幸的是它没有答案所以我想知道是否有人可以请求帮助。问题是:
您的任务是在公司内传播邀请。你只有 是时候与一定数量的人交谈,但如果你有保证的话 你邀请某人,他们会邀请他们的老板,那个人会 邀请他们的老板,等等,一直到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次,但这不是很有用。我认为有一种动态的编程方法,但我的尝试并不总能提供正确的答案。任何帮助将不胜感激!
答案 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
,它会自动为我们提供D
,B
和A
。然后,仍然从三棵树中选择2
I E C
J K F G
L M N O
下一个最佳选择是L
,依此类推。
我们可以有效地做到这一点,因为我们只需要跟踪每个节点的最深的孩子(不一定是直接孩子),我们可以事先计算出来。然后,我们需要某种优先级队列数据结构来选择最佳树。如果您从大小为k
的层次结构中选择n
人,则应该提供O(n + k log n)
算法。
要将此扩展到值可能不相等的情况,基本上完全相同的想法是有效的,除了深度之外,您需要计算所有上级的总值。对于每个节点X
,您可以跟踪Y
和Y
之间路径上总值最大的子X
。
答案 2 :(得分:0)
听起来像graph problem。您可以使用连接组件的概念来实现此解决方案。
person F
是person E
的老板,而person D
的老板又是person A
的老板......低至{{1}},那么你想在dfs之后能够在O(1)时间内说出人F是人A的老板,反之亦然。请记住为每个老板计算一个计数,其中计数将是他下面所有人的价值总和,并可选择跟踪人数。
最佳情况是你会发现链中的所有人都是较低的,否则算法应该在O(nk)中运行,其中k是从下到上的最大链