【問題描述】使用動態規劃演算法解凸多邊形最優三角剖分問題,具體來說就是,依據遞迴式,按照順序求得子問題,使得該三角剖分中諸三角形上權之和為最小。
【輸入形式】在螢幕上輸入凸多邊形頂點個數和頂點座標。
【輸出形式】最優三角剖分後的三角形頂點。
【樣例輸入】
8 26
0 20
0 10
10 0
22 12
27 21
15 26
【樣例輸出】
【樣例說明】
輸入:頂點個數為7,每一行為乙個頂點座標,以空格分隔。
輸出:每一行為順序產生的最優三角剖分後的三角形頂點。
【評分標準】根據輸入得到準確的輸出。
python實現:
import numpy as np
import math
def min_weight(n, m, s, weights): # 計算最優值並記錄最優決策
for i in range(1, n):
m[i][i] = 0
s[i][i] = 0
for r in range(2, n):
for i in range(1, n-r+1):
j = i+r-1
m[i][j] = m[i+1][j]+weights[i-1][i]+weights[i][j]+weights[j][i-1] # get_weight(i-1, i, j)
s[i][j] = i
for k in range(i+1, j):
t = m[i][k]+m[k+1][j]+weights[i-1][k]+weights[k][j]+weights[j][i-1] # get_weight(i-1, k, j)
if t < m[i][j]:
m[i][j] = t
s[i][j] = k
def traceback(i, j, s):
if i == j:
return
traceback(i, int(s[i][j]), s)
traceback(int(s[i][j] + 1), j, s)
print(str(i-1)+str(s[i][j])+str(j))
def main():
n = int(input())
a =
for _ in range(n):
weights = np.zeros((n, n), dtype=int)
for i in range(n):
weights[i][i] = 0
for i in range(n):
for j in range(i+1, n):
x = a[i][0]-a[j][0]
y = a[i][1]-a[j][1]
weights[i][j] = weights[j][i] = math.sqrt((x**2)+(y**2))
# print(weights)
m = np.zeros((n, n), dtype=int) # 存放最優值
s = np.zeros((n, n), dtype=int) # 存放最優決策
min_weight(n, m, s, weights)
traceback(1, n-1, s)
if __name__ == '__main__':
main()
凸多邊形的最優三角剖分
如圖所示,用頂點的逆時針序列表示凸多邊形,即p 表示具有n條邊的凸多邊形。給定凸多邊形p,以及定義在由多邊形的邊和弦組成的三角形上的權函式w。如圖所示劃分,要求確定該凸多邊形的三角剖分,使得該三角形上的勸之和最小。解析 若凸 n 1 邊形p 的最優剖分t包含三角形v0vkvn,1 k n 1,則t的...
4 5 凸多邊形最優三角剖分
動態規劃法解凸多邊形最優三角剖分 1 凸多邊形的三角剖分 將凸多邊形分割成互不相交的三角形的弦的集合t。2 最優剖分 給定凸多邊形p,以及定義在由多邊形的邊和弦組成的三角形上的權函式w。要求確定該凸多邊形的三角剖分,使得該三角剖分中諸三角形上權之和為最小。定義乙個頂點到其他頂點的權 weights ...
凸多邊形最優三角剖分問題
參考書籍 演算法設計與分析 王曉東 動態規劃 1.問題描述 注 是所有的三角形的權值之和,不是只計算邊和弦的權值之和 2.分析 3.編碼實現 author 胡家威 createtime 2011 11 10 下午12 31 16 description 凸多邊形的最優三角剖分 packageex2 ...