我今天正在爱尔兰读一本计算机科学杂志,它有一个回答这个问题的竞赛。任何人都可以帮我解决它。
问题所在。
给定x1 ......,xn,确定应激活EMP的时间 摧毁最大数量的外星人。
实施例。假设n = 4且x1 ... x4 = 1,10,10,1。那么最好的解决方案就是 是在第3和第4分钟激活EMP。在第3分钟,它摧毁 min(10,3 ^ 2)= 9个外星人。然后在第4分钟,它摧毁min(1,1 ^ 2)= 1外星人。这个 总共有10个外星人。
2个问题
(a)设S(j)表示为子问题销毁的外国人的最大总数 由外国人组成,仅在前j分钟到达。给出一个递归公式 对于S(j)。另外,记下基本案例。 (提示:对于S(j),你总是激活 EMP在第j分钟。假设先前的激活发生在第i分钟。 尝试我的所有可能性并采取最大的。)
(b)为此问题提供动态编程算法。分析时间和 算法的空间复杂度。
要点: - 一群外星人在n分钟内到达。在第i分钟,xi外星人 到达。基于遥感数据,您事先知道这个序列x1 ... xn。
你可以使用电磁脉冲(EMP),它可以摧毁一些 外星人EMP的功率取决于允许充电的时间 起来。为了确保这一点,如果自上次使用EMP以来已经过了j分钟,那么 能够摧毁外星人。
EMP只会摧毁外星人在其被激活的确切时刻到达。在 换句话说,它不会摧毁任何早晚出现的外星人。
因此,如果它在第k分钟使用,并且自从之前使用以来已经是j分钟,那么它会破坏min(xk,j2)外星人(即,无论xk或j2哪个更小)。 / p>
每次使用后,EMP将完全耗尽。我们还假设EMP开始 关闭(在第0分钟)完全耗尽。
答案 0 :(得分:2)
(a)提示真的让它离开了。显然S(0) = 0
和S(1) = 1
。我们有:
S(j) = max{S(i) + min(x[j], (j - i)^2) : 0 <= i < j}
。这真的只是做了提示所说的。以下是它将如何运行您的示例:
1 10 10 1
S(0) = 0
S(1) = 1
S(2) = max{S(0) + min(x[2], (2-0)^2), S(1) + min(x[2], (2 - 1)^2)} =
= max{0 + 4, 1 + 1}
= 4
S(3) = max{S(0) + min(x[3], (3 - 0)^2), S(1) + min(x[3], (3-1)^2), S(2) + min(x[3], (3-2)^2)}
= max{0 + 9, 1 + 4, 4 + 1}
= 9
S(4) = max{S(0) + min(x[4], (4 - 0)^2), ..., S[3] + min(x[4], (4-3)^2)}
= max{0 + 1, ..., 9 + 1}
= 10
(b)我已经解决了上述问题。只需将S
作为数组。由于每个S(i)
的计算需要迭代所有j < i
,因此每个S(i)
需要O(n)
次,因此整个算法为O(n^2)
。