ここでのオリジナルタイトルリンク:https://leetcode.com/problems/minimum-score-triangulation-of-polygon/
トピック:
与えられた N
、凸考慮 N
ラベルされた頂点を持つ-sidedポリゴン A[0], A[i], ..., A[N-1]
時計回りの順にを。
あなたにポリゴンを三角とし N-2
た三角形。各三角形について、その三角形の値が頂点のラベルの製品であり、そして 総スコア 三角測量のは、すべてのこれらの値の合計であり、 N-2
三角測量に三角形。
あなたは、多角形の一部の三角測量を達成することができます可能な最小の合計スコアを返します。
例1:
入力:[1,2,3]
出力:6
説明:ポリゴンが既に三角形分割され、そしてのみ三角形のスコアは6です。
例2:
入力:[3,7,4,5]
出力:144
説明:可能なスコアを持つ2つの三角形が存在する:3 * 7 * 5 + 4 * 5 * 7 = 245、または+ 3 * 5 * 4 3 * 4 * 7 = 144最小スコアは144です。
例3:
入力:[1,3,1,4,1,5]
出力:13
説明:最小スコア三角測量スコア有する1 * 1 * 3 + 1 * 1 * 4 + 1 * 1 * 5 + 1 * 1 * 1 = 13。
注意:
3 <= A.length <= 50
1 <= A[i] <= 100
ソリューション:
A [i]とA [J]との間のエッジが多角形にのみ1つの三角形を構成することになります。iとjの間のkと、これらの3つのノードはtrangle、残りI〜K、及びK〜Jを構築する多角形です。最小を維持します。
[J]に[i]はDP [i] [j]は最小スコアがAからノードを使用してしまった示しましょう。
Iより大きく、Jよりも小さいすべてのkについて、分(DP [I] [K] + DP [K] [J] + [I] * A [j] * A [K])によってmimimumスコアを維持します。
時間計算:O(N ^ 3)。N = A.length。
スペース:O(N ^ 2)。
ACのJava:
1 クラスソリューション{ 2 公共 INT minScoreTriangulation(INT [] A){ 3 int型 N = A.length。 4 INT [] [] DP = 新しい INT [N] [N]。 5 のための(int型 D = 2; D <N; D ++ ){ 6 のための(int型 I = 0、I + D <N; iが++ ){ 7 のint J = +はDを、 8 DP [I] [J] = Integer.MAX_VALUEの; 9 用(int型、K <J、K = I + 1 kは++ ){ 10 DP [I] [J] = Math.min(DP [I]、[J]、DP [I] [K] + DP [K] [J] + [I] * A [j] * A [K] ); 11 } 12 } 13 } 14 15 戻り DP [0]〜[N-1 ]。 16 } 17 }
別の実装。
1 クラスソリューション{ 2 公共 INT minScoreTriangulation(INT [] A){ 3 int型 N = A.length。 4 INT [] [] DP = 新しい INT [N] [N]。 5 のための(INT ; J、J = 2 <N; jは++ ){ 6 のための(int型 IがJ-2 =; I> = 0; i-- ){ 7 DP [I] [J] = Integer.MAX_VALUEの; 8 のための(int型、K <J、K = I + 1 kは++ ){ 9 DP [I] [J] = Math.min(DP [I]、[J]、DP [I] [K] + DP [K] [J] + [I] * A [j] * A [K] ); 10 } 11 } 12 } 13 14 戻り DP [0]〜[N-1 ]。 15 } 16 }