假设我有一组n
堆栈。每个堆栈si
都有mi
个元素(任意整数)。现在我想玩一个小游戏:在游戏过程中的任何时候我都可以弹出堆栈的任何子集,前提是它们的顶级元素是相同的。根据弹出的堆栈数p
,我得到一定数量的积分:0 p==1
,否则2 p-2 。
如果我想用最优策略计算得到的最大点数,我最好如何迭代这些堆栈?
我能想到的最好的是创建一个m1 x ... x mn
表T,其中T(i1,...,in)
=当堆栈k
剩余ik
个元素时可达到的最大点数(即堆栈{{ 1}}剩下1
个元素,...,堆栈i1
剩下n
个元素。
要计算in
,我们首先要确定仍然至少有一个元素的堆栈T(i1,...,in)
;让它的大小为S
。
如果d
可以在这里和那里计算d < 2
。否则,我们会计算T(i1,...,in)
,对于每个c = 1 to 2^d
,我们会使用其二进制表示来确定c
中的“当前选择”cs
,检查顶部的有效性标准S
中包含的堆栈元素,如果满意,请查看cs
以计算“候选解决方案”,其中
T(j1,...,jn)
如果尚未计算jk = k in cs ? ik - 1 : ik
,我们首先会计算它。然后将T(j1,...,jn)
设置为这些“候选解决方案”的最大值。
或者,我们可以从T(i1,...,in)
开始,然后填写整个内容。
无论哪种方式,这都太慢了。但是,我没有想出更聪明的东西。您可以与我分享任何帮助/提示吗?