动态编程 - 在一组堆栈上进行有效迭代

时间:2015-10-25 13:58:59

标签: algorithm dynamic-programming

假设我有一组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)开始,然后填写整个内容。

无论哪种方式,这都太慢了。但是,我没有想出更聪明的东西。您可以与我分享任何帮助/提示吗?

0 个答案:

没有答案