动态规划练习的递归关系

时间:2013-03-09 17:58:26

标签: algorithm language-agnostic dynamic-programming recurrence

我收到了动态编程任务,我需要帮助找出重现关系。问题类似于加权区间问题,但它有一些额外的限制:

  • 您将获得一系列N个时段,每个时段的持续时间相同。
  • 每个时段k0 <= k < N都会获得正重W[k]
  • 对于[i, j] i < j的任何时间间隔,间隔的权重W[i,j]为:
    W[i,j] = W[i+1] + W[i+2] + ... + W[j]
    请注意,第一个时段的权重W[i]不计算在内,因此任何长度为1的时间间隔的权重都为0

您将获得一个值T < N,并要求您准确选择T个时段,以便最大化所选时间间隔的总和。

示例:对于N = 5T = 4和权重W = (3, 9, 1, 1, 7),选择W[0, 1] = 9W[3, 4] = 7的最大权重为16

1 个答案:

答案 0 :(得分:5)

这是一个很好的小问题...如果选择的最后一个槽(最后一个范围的末尾)是i并且在槽0..i之中,那么将S(i,t)定义为可能的最大权重选择了插槽。

DP的决定是我们要么将w [i]添加到S(i,t)中,要么我们不是因为选择了插槽i-1,或者不是。所以我们有:

S(i, t) = max ( S(i-1, t-1) + w[i], S(j, t-1) for j = t-2..i-2 )

t-1&gt; i无意义的情况。因此基本情况是S(i,1)= 0,0 <= i <1。 N表和DP表的连续列(t = 2,...,T)各自比最后一列短。期望的答案是max(对于j = T-1..N-1,S(j,T))

很高兴您可以安排计算,以便逐步计算最大值,运行时间为O(NT),空间为O(N)

根据您的示例,DP表如下所示:

               t = 
         1    2    3    4
       ------------------
i = 0 |  0
    1 |  0    9   
    2 |  0    1   10
    3 |  0    1    9   11
    4 |  0    7    9   16

答案是max(11,16)= 16