我收到了动态编程任务,我需要帮助找出重现关系。问题类似于加权区间问题,但它有一些额外的限制:
N
个时段,每个时段的持续时间相同。k
,0 <= 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 = 5
,T = 4
和权重W = (3, 9, 1, 1, 7)
,选择W[0, 1] = 9
和W[3, 4] = 7
的最大权重为16
。
答案 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