Algorithm 动态规划练习

Algorithm 动态规划练习,algorithm,dynamic,dynamic-programming,Algorithm,Dynamic,Dynamic Programming,我一直在努力完成一个动态编程练习,但我似乎无法掌握它。我会在这里写下问题和解决方案,明确说明我不明白的地方 我们得到了两个序列u1,u2,…,un和d1,d2,…,dm,以及一个由正整数C=[cij]构成的维数矩阵nxm。k对的列表 ((ui1,dj1),(ui2,dj2),…,(uik,djk))如果 i1m 我不太了解当前情况,为什么要分配−∞min{n时,编码>到M(i,j,t)− i+1,m− j+1}但当i>n或j>m 解是M(1,1,k)。M(i,j,t)=max{M(i+1,j+

我一直在努力完成一个动态编程练习,但我似乎无法掌握它。我会在这里写下问题和解决方案,明确说明我不明白的地方

我们得到了两个序列
u1,u2,…,un
d1,d2,…,dm
,以及一个由正整数
C=[cij]
构成的维数矩阵
nxm
。k对的列表
((ui1,dj1),(ui2,dj2),…,(uik,djk))
如果
i1<12 n或j>m
我不太了解当前情况,为什么要分配
−∞t>min{n时,编码>到
M(i,j,t)
− i+1,m− j+1}
但当
i>n
j>m

解是M(1,1,k)。

M(i,j,t)=max{M(i+1,j+1,t− 1) +c(i,j),M(i,j+1,t),M(i+1,j,t)。} =最大值 { M(i+1,j+1,t-1)+c(i,j),min{n− i+1,m− j+1}

因为在这种情况下您无法找到解决方案。在步骤
i
,您只能从第一个序列中拾取
n-i+1
元素(因为您已经拾取到
i
)。对于
j
,相同。如果
t>min{n-i+1,m-j+1}
,则您将无法从其中一个列表中选择所需数量的元素,并将其标记为负无穷大

但当i>n或j>m时为0

这只是为了处理超出范围的错误。我不确定他们为什么选择
0
,我也会选择负无穷大,只是为了一致性,或者只是通过在实现中加入条件来避免它(如果
i+1>=n
则忽略此分支,尽管如果没有任何分支有效,则仍需要返回0/-infinity),但这并不重要

如果您返回
0
,并且答案是否定的,那么您将遇到问题。当然,对于您的问题,由于
C
的构建方式,我们无法得到否定的解决方案(因为C包含数字的平方,它们总是
=0
)因此,在第一种情况下,你可以使用
0
,而不是负无穷大

练习:你能写一个类似的循环吗,但它的解是由
M(n,M,k)
给出的?先用文字定义它,然后用数学方法定义它

M(i, j, t) = max {M(i + 1, j + 1, t − 1) + c(i, j), M(i, j + 1, t),M(i + 1, j, t).}
           = max
             {
                 M(i+1, j+1, t-1) + c(i, j), <- we know the maximum cost of t-1 
                                                non-intersecting pairs taken from
                                                i+1,...,n and j+1,...,m to which
                                                we prepend the pair (i, j).
                 M(i, j+1, t), <- keep it at t elements and don't prepend anything,
                                  and take the one containing elements from
                                  i,...,n and j+1,...,m
                 M(i+1, j, t) <- same, but take elements from i+1,...,n and j,...,m
             }