这闻起来很像家庭作业问题。我建议您与讲师或助教见面,因为这是最好的互动学习方式。如果您使用此信息,请务必引用,以免抄袭。
首先,观察结果在值[a0, a1, ... aN] 中是线性的。因此,您实际上只需要跟踪它们的系数。出于符号的目的,让我们写{b1, b2, ..., bN} 来代表b1 * a1 + b2 * a2 + ... bN * aN。
接下来,手工算出一些递归:
f([a1, a2], a, 2) = { 1/2, 1/2 } 是N=2 的基本情况。
我们来看看N=3:
f([a1, a2, a3], a, 3) 为 a 甚至 = {1/2, 0, 1/2} + { f([a1, a2], a+1, 2)/2, 0 } + { 0, f([a2, a3], a+1, 2)/2 } = { 1/2, 0, 1/2 } + { 1/4, 1/4, 0 } + { 0, 1/4, 1/4 } = { 3/4, 1/2, 3/4 }。
f([a1, a2, a3], a, 3) 为 a 奇数 = { f([a1, a2], a+1, 2)/2, 0 } + { 0, f([a2, a3], a+1, 2)/2 } = { 1/2, 0, 1/2 } + { 1/4, 1/4, 0 } + { 0, 1/4, 1/4 } = { 1/4, 1/2, 1/4 }。
现在N=4:
f([a1, a2, a3, a4], a, 4) 为 a 甚至 = { 1/2, 0, 0, 1/2 } + { f[a1, a2, a3], a+1, 3)/2, 0 } + { 0, f([a2, a3, a4], a+1, 3)/2 }。因为a 是偶数,a+1 是奇数,所以我们是F([], even, 3)。 f([a1, a2, a3, a4], a, 4) 为 a 甚至 = { 1/2, 0, 0, 1/2 } + { 1/8, 1/4, 1/8, 0 } + { 0, 1/8, 1/4, 1/8 } = { 5/8, 3/8, 3/8, 5/8 }。
f([a1, a2, a3, a4], a, 4) 为 a 奇数 = { f[a1, a2, a3], even, 3)/2, 0 } + { 0, f([a2, a3, a4], even, 3)/2 } = { 3/8, 1/4, 3/8, 0 } + { 0, 3/8, 1/4, 3/8 } = { 3/8, 5/8, 5/8, 3/8 }。
现在您可以看到系数仅取决于 N 以及 a 是偶数还是奇数。
这意味着您的动态规划只需要记住N 和布尔值的每个组合的系数。由于N 的上限为 2000,这意味着您只需要 4000 个条目,这不应该是太大的负担。事实上,您可以放弃递归,像我们上面所做的那样简单地增量计算整个表。