在我的算法课程中,本书中的一个问题如下:"给出一个数组[1..n]的正数和一个整数k。你必须产生一个数组b [1..n],这样:对于每个j,b [j]是1或0.数组b最多有K次相邻1。 < = j< = n的和(a [j] * b [j])最大化。"例如,给定阵列[10,100,300,400,50,4500,200,30,90]和k = 2,阵列b可以是= [1,0,1,1,0,1,1,0] ,1]最大化总和为5500.
该解决方案在与一些朋友讨论时使用动态编程,他们说递归关系的形式为M(i,j)= max(M(i-2,j)+ a [i],M(i- 1,j-1)+ a [i])
有人可以解释为什么这样吗?或者如果他们有不同形式的解决这样的问题。我发现Dynamic编程有点难以掌握。 谢谢。
答案 0 :(得分:1)
M [i,j]是从1到i的最大和,其中j与1相近
M [i,j]可以计算为最多3种情况:
b[i]=0 => S=M[i-1, j] // a[i] not added to sum, b[1..i-1] has same number of adjacent 1s (j) as b[1..i] because b[i] is zero
b[i]=1 and b[i-1]=0 => S=M[i-2, j]+a[i] // a[i] added to sum, b[1..i-2] has same number of adjacencent 1s, because b[i-1] is zero
b[i]=1 and b[i-1]=1 => S=M[i-1, j-1]+a[i] // a[i] added to sum, since b[i] and b[i-1] are both 1, they count as adjacent 1s, so b[1..i-1] contains only j-1 adjacent 1s
递归规则是上述3个和的最大值。 结束条件是M [1,j] = a [1],因为b [1..1]只有一个项目b [1] = 1且没有相邻的1s。
我们需要的答案是M [n,k]。
复杂性是O(nk)。