Google访谈:查找多边形的最大总和

时间:2013-01-19 07:23:39

标签: algorithm data-structures matrix-multiplication

给定具有N个顶点和N边的多边形。每个顶点都有一个int数(可能是负数),每个边上都有一个集合(*,+)的运算。每次,我们从多边形中移除边E,将边(V1,V2)链接的两个顶点合并到一个值为V1 op(E) V2的新顶点。最后一种情况是两个带有两条边的顶点,结果是较大的一个。

返回可以从给定多边形获得的最大结果值。

对于最后一种情况,我们可能不需要两次合并,因为另一个数字可能是负数,所以在这种情况下我们只会返回更大的数字。

我如何解决问题:

 p[i,j] denotes the maximum value we can obtain by merging nodes from labelled i to j.
 p[i,i] = v[i] -- base case
 p[i,j] = p[i,k] operator in between p[k+1,j] , for k between i to j-1.
and then p[0,n] will be my answer.
Second point , i will have to start from all the vertices and do the same as above as this will be cyclic n vertices n edges.
The time complexity for this is n^3 *n i.e n^4 .

我可以做得更好吗?

2 个答案:

答案 0 :(得分:5)

正确识别(标记)后,这确实与矩阵乘法问题非常相似(为了快速完成矩阵,我将以何种顺序乘以矩阵)。

这可以使用动态算法以多项式求解。

我将改为解决一个类似的,更经典的(和相同的)问题,给定一个带有数字,加法和乘法的公式,用括号括起来的方法给出最大值,例如 6+1 * 2变为(6+1)*2,超过6+(1*2)

让我们将a1 to 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

这贯穿所有可能的选择。通过对大小n = j-i的归纳来完成TProof的正确性并且非常简单。

让我们进行运行时分析:

如果我们不为较小的子问题动态保存值,则运行速度非常慢,但我们可以在O(n^3)

中使此算法的执行速度相对较快

我们创建一个* n表T,其中索引i,j处的单元格包含F(i,j)填充F(i,i)和F(i,j),其中j小于i,在O中完成( 1)对于每个单元格,因为我们可以直接计算这些值,然后我们对角线并填充F(i + 1,i + 1)(我们可以快速完成,因为我们已经知道递归公式中的所有先前值),我们对于n个对角线(表中的所有对角线)重复这n次并且填充每个单元格需要(O(n)),因为每个单元格都有O(n)个单元格,我们用O(n ^ 2)填充每个对角线,这意味着我们填写O(n ^ 3)中的所有表。填写完表后,我们显然知道F(1,n)是你问题的解决方案。

The order that we fill our table

现在回到您的问题

如果将多边形转换为n个不同的公式(一个用于从每个顶点开始)并在其上运行公式值算法,则可以获得所需的值。

答案 1 :(得分:0)

我认为你可以减少强力搜索的需要。例如:如果有一串

x + y + z

你可以用一个值为和的顶点替换它,你不能做得更好。当你处理+ ve整数时,你需要在加法后进行乘法运算。因此,如果它都是正面的,那么只需减少所有+链然后再多变。

这样就留下了-ve数字的情况。在我看来,单个数字的策略是非常明显的,对于两个-ve数字有一些情况(记住 - x - 是正数)和超过2 -ve数字似乎变得棘手: - )