关于算法:动态规划练习的递归关系

Recurrence Relation for Dynamic Programming Exercise

我收到了一份动态规划作业,我需要帮助找出递归关系。该问题类似于加权区间问题,但它有一些额外的限制:

  • 您将获得一系列 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 的最大权重。


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

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

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

t-1>i 无意义的情况。所以基本情况是 S(i, 1) = 0 for 0 <= i < N,并且 DP 表的连续列 (t = 2,...,T) 每列都比最后一列短。期望的答案是 max ( S(j, T) for j = T-1..N-1 )

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

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

1
2
3
4
5
6
7
8
               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