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
}