正如您已经正确识别(标记)的那样,这确实与矩阵乘法问题非常相似(我以什么顺序乘以矩阵以便快速完成)。
这可以使用动态算法通过多项式求解。
我将解决一个类似的、更经典(且相同)的问题,给定一个包含数字、加法和乘法的公式,例如,用括号括起来的方式会给出最大值6+1 * 2
变成(6+1)*2
这超过了6+(1*2)
.
让我们表示我们的输入a1 to an
实数和 o(1),...o(n-1) 之一*
or +
。我们的方法将按如下方式工作,我们将观察子问题 F(i,j),它表示 a1,...aj 的最大公式(括号化后)。我们将创建一个此类子问题的表,并观察 F(1,n) 正是我们正在寻找的结果。
Define
F(i,j)
- If i>j return 0 //no sub-formula of negative length
- If i=j return ai // the maximal formula for one number is the number
- If i<j return the maximal value for all m between i (including) and j (not included) of:
F(i,m) (o(m)) F(m+1,j) //check all places for possible parenthasis insertion
这将遍历所有可能的选项。正确性证明是通过对大小 n=j-i 进行归纳来完成的,并且非常简单。
我们来进行一下运行时分析:
如果我们不动态保存较小子问题的值,则运行速度会相当慢,但是我们可以使该算法在O(n^3)
我们创建一个 n*n 表 T,其中索引 i,j 处的单元格包含 F(i,j),填充 F(i,i) 和 F(i,j)(对于小于 i 的 j)在 O(1) 中完成每个单元格,因为我们可以直接计算这些值,然后我们沿对角线填充 F(i+1,i+1) (我们可以很快完成,因为我们已经知道递归公式中的所有先前值),我们重复此 n n 个对角线(实际上是表中的所有对角线)的时间,填充每个单元格需要 (O(n)),因为每个单元格有 O(n) 个单元格,我们用 O(n^2) 填充每个对角线,这意味着我们填充所有O(n^3) 中的表。填写表格后,我们显然知道 F(1,n) 这是您问题的解决方案。
现在回到你的问题
如果将多边形转换为n
不同的公式(从每个顶点开始)并对其运行公式值的算法,您将得到您想要的值。