动态编程最佳广播

时间:2014-05-25 19:38:25

标签: algorithm dynamic

我知道如何以通常的方式解决这个问题,而不是使用动态编程。 如果你能够善意向我解释解决方案/给我一个总体思路/伪代码。非常感谢。

输入由序列R = hR0组成。 。 。 ,非负整数的Rni和整数k。数字Ri表示在时间i(例如从www服务器)请求某些特定信息的用户数量。

如果服务器在某个时间t广播此信息,则请求该信息的所有用户的请求 严格地在时间t满足之前。服务器最多可以广播此信息k次。目标是选择k次广播,以最小化请求/用户必须等待的总时间(在所有请求上) 满足他们的要求。

作为一个例子,假设输入是R = 3,4,0,5,2,7(所以n = 6)和k = 3.那么一个可能的解决方案 (没有声称这是最佳解决方案)将在第2,4和7次广播(请注意,这是显而易见的 在每个最佳时间表中,如果Rn 6 = 0,则在时间n + 1处存在广播。在时间1的3个请求会 然后必须等待一次单位。然后,在时间2的4个请求将必须等待2个时间单位。 5个请求 时间4然后必须等待3个时间单位。在时间5的2个请求将必须等待2个时间单位。该 在时间6的7个请求将必须等待1个时间单位。因此,该解决方案的总等待时间将是 3×1 + 4×2 + 5×3 + 2×2 + 7×1。

I / O说明。输入:n和k,在第一行上用一个空格分隔,然后在第二行用R分隔。输出: k次序列。

1 个答案:

答案 0 :(得分:1)

  1. 在时间i设置第一个广播。
  2. 解决R'= {Rj |的问题j> = i}和k'= k-1
  3. 当然,您需要存储所有子解决方案,使其成为动态编程算法而不是普通递归。

    请注意,您必须以k-1广播时间开始,因为第k次广播将始终位于非零用户的最后一次之后。

    问题出在第1步。您可以尝试每个可能的位置(最坏情况时间复杂度将是n * k我认为)。我建议你首先尝试这种天真的方法,测试一些数据,看看你是否能找到更好的方法来找到第一个广播的位置。