给定三角形的长度,找到最大面积三角形

时间:2013-11-25 23:53:49

标签: algorithm dynamic-programming

有一个数组包含三角形的可能长度。找出哪三个长度可以构建最大三角形。

我可以计算所有可能的三角形区域(苍鹭的公式)来找到最大值,但运行时间很糟糕。如何设计运行时间为(n * n)的算法?

1 个答案:

答案 0 :(得分:2)

我相信你可以在线性时间内解决这个问题,除了你必须首先订购你的三角形长度,即O(nlogn)。

这是我将如何做到的。

伪码:

// V is the set of length of triangle.

Order(V)

// Heron Formula
define A(a,b,c) = SQRT(4a^2*b^2 - (a^2 + b^2 - c^2) ^2) / 4 

// I is the last position in V
I := V.length - 1

// T(I) is the area of Maximum Area Triangle
T(I) =
if V[I]^2 <= V[I-1]^2+V[I-2]ˆ2
     then return A(V[I-2],V[I-1],V[I])
else 
     return MAX( A(V[I-2],V[I-1],V[I]), T(I-1) )

说明: 假设c> = b> = a,当c ^ 2 <= a ^ 2 + b ^ 2时,如果增加任何变量(a,b或c),则将具有面积更大的三角形。因此,如果您将三个最大数字达到峰值并且等式c ^ 2&lt; = a ^ 2 + b ^ 2为真,则表示您找到了最大的区域。但是,如果c ^ 2&lt; = a ^ 2 + b ^ 2不成立,即c ^ 2> a ^ 2 + b ^ 2,则具有不同设置的三角形可能具有更大的面积。如果我们将b或a更改为较低的值,我们是否会有较低的区域,因此这不是一个选项。因此,我们唯一的选择是为c选择一个diferente值,即T(I-1),它也是一个递归。 A(V [I-2],V [I-1],V [I])和T(I-1)之间的最大值将是您的答案。