繁体   English   中英

动态编程最佳广播

[英]Dynamic Programming optimal broadcast

我知道如何以通常的方式解决此问题,而不使用动态编程。 如果您足够友好地向我解释解决方案,请给我一个一般的想法/伪代码。 谢谢你

输入由序列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个请求将不得不等待1个时间单位。 那么,在时间2的4个请求将不得不等待2个时间单位。 那么在时间4的5个请求将不得不等待3个时间单位。 然后,在时间5的2个请求将不得不等待2个时间单位。 那么在时间6的7个请求将不得不等待1个时间单位。 因此,此解决方案的总等待时间为3×1 + 4×2 + 5×3 + 2×2 + 7×1。

I / O描述。 输入:n和k,在第一行中以一个空格分隔,然后在第二行中以R分隔。 输出:k次的序列。

  1. 在时间i设置第一个广播。
  2. 解决R'= {Rj | j> = i}且k'= k-1

当然,您将需要存储所有子解决方案以使其成为动态编程算法,而不是简单的递归。

请注意,您必须以k-1个广播时间开始,因为第k个广播将始终在上次使用非零用户的时间之后。

问题出在步骤1。您可以尝试所有可能的位置(最坏的情况是时间复杂度为n * ki认为)。 我建议您首先尝试这种简单的方法,在一些数据上对其进行测试,然后看看是否可以找到一种更好的方法来查找第一个广播的位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM