我已经在这里回答了此问题:
Google面试:找到多边形的最大和,有人指出这个问题是一个重复的问题。由于还没有人完整回答这个问题,我决定在这里添加答案。
正如你所标记的那样,这确实与矩阵乘法问题非常相似(按什么顺序乘矩阵才能快速完成)。
这可以使用动态规划算法多项式地解决。
我将解决一个类似的、更经典的(并且相同的)问题,即给出一个带有数字、加法和乘法的公式,哪种括号方式会给出最大值,例如
6+1 * 2
变成
(6+1)*2
比
6+(1*2)
大。
我们将用a1到an表示输入实数,o(1),...o(n-1)是
*
或
+
。我们的方法如下,我们将观察子问题F(i,j),它表示a1,...aj的最大公式(括号化后)。我们将创建这些子问题的表,并观察到F(1,n)正好是我们要寻找的结果。
定义
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
这段内容涉及IT技术,将讨论一个算法和其运行时间分析。证明正确性可通过对大小为n=j-i的问题进行归纳来完成,而这是相当平凡的。
现在让我们进行运行时间分析:
如果我们不为较小的子问题保存动态值,则运行速度会很慢,但我们可以使这个算法在O(n^3)时间内表现得相对快速。
我们创建一个n*n的表T,其中索引i,j处的单元格包含F(i,j),填充F(i,i)和j小于i的F(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个不同的公式(每个公式从一个顶点开始),并在其上运行该算法,则可以得到所需的值。
a[0]
和a[n-1]
进行操作,但对于多边形的顶点是有效的。 - laike9m