凸多邊形最優分割是典型的動態規劃問題
凸多邊形最優剖分:
給定凸多邊形,以及定義在由多邊形的邊和弦上的權函式,使得該多邊形三角剖分後所有三角形權值之和最小。
思路:先將多邊形三角剖分
2、三角剖分
最優子結構性質
:若n+1邊形的最優三角剖分包含三角形v0vkvn
(1<=k<=n)
則t的權為三個部分權之和:
------三角形v0vkvn
的權,
------多邊形的最優三角剖分權值
------多邊形的三角剖分權值
(為什麼要選取三角形v0
vkvn
?因為在三角剖分後,必定含有乙個三角形的兩個頂點為v0,
vn。v
0,vn可以是多變形任意一條邊的兩個端點!)
如下圖所示:
可以斷言,由t確定的這兩個子多邊形的三角剖分也是最優的。因為若有和更小的三角剖分,將導致t不是最優三角剖分的矛盾。因此,凸多邊形的三角剖分問題具有最優子結構性質。
3、遞推關係:
設t[i][j],1<=ii-1,vi……vj}的最優三角剖分所對應的權值函式值,即其最優值。最優剖分包含三角形vi-1vkvj的權,子多邊形的權,子多邊形的權之和。
因此,可得遞推關係式:
------當i=j時,只有多邊形的一條邊,所以不存在三角剖分,即t[i][j]=0;
------當i
------程式執行過程:(1)初試化:
(以n+
1邊形每個頂點作為t[i][j]中的i值),
i=j時,t[i][j]=0;
(2)先將多邊形分割成較小的多邊形:使j=i+1,即為三角形,
(以n+
1邊形每個頂點作為t[i][j]中的i值):計算出每乙個三角形的最優三角剖分值t[i][j] (即三角形本身權值),存放在陣列t[i][j]中;
使j=i+2,即為四邊形,計算最優三角剖分值,存放在陣列t[i][j]中
具體演算法在下面:
使j=i+3.......
使j=i+4.......
。。。。。。
(3)當j=i+n-1時,即為n+1邊形,計算出最優三角剖分值t[i][j],即為最終結果。
凸(n+1)邊形p的最優權值為t[1][n]。
------該演算法所用遞推關係:每一次被分割的小多邊形的最優三角剖分都用到上一次最優剖分的計算結果,產生遞推關係!
比如:計算五邊形
的t[i][j]值時,需要用到四邊形的t[i][j]值,計算四邊形
的t[i][j]值時,需要用到三角形的三角剖分值,即其本身權值!
,,}; /*存放多變形每乙個點到其它點的權值,每個點到自己的權值為0,第i組第j個數表示第i個點到第j個點的權值,
如這組中5表示第2個頂點到第4個頂點的權值*/
int min(int n,int **t);/*n表示多邊形邊數,t用來存放最優三角剖分值*/
int weight(int a,int b,int c);/*該函式用來計算三角形的權值*/
int main()
cout<
return 0;
}int min(int n,int **t)
for(int r=2;r<=n;r++)/*n邊形需要迴圈計算n-1次,上述演算法執行過程的第二步*/}}
}return t[1][n];
}int weight(int a,int b,int c)
凸多邊形最優三角剖分 動態規劃
解答 題目中頂點座標編號從1開始,為了方便程式設計,將頂點從0開始,頂點的編號變為0到7。定義t i j 0 由於退化的兩點多邊形的權值為0,t i i 0。最優子結構的性質,t i j 的值是t i k 的值加上t k j 的值,再加上三角形vivkvj的權值,其中,it i j t i k t ...
動態規劃 凸多邊形最優三角剖分
在這裡,權值可以是任何和弦長,邊長有關的權函式,一般來說,我們使用三角形的邊長作為權值。在這個問題中,是具有最優子結構的。設一共有n邊的凸多邊形點的集合為,在以v0和vn 1為底的情況下,求k 0,n 1 使v0,vn 1,vk組成的三角形權值最小。這樣,剩下的兩個點集和就可以組成新的凸多邊形。在其...
動態規劃DP 凸多邊形最優三角剖分
我們可以把披薩餅看作是乙個凸多邊形,凸多邊形是指多邊形的任意兩點的連線均落在多邊形的內部或邊界上。1 什麼是凸多邊形?如下圖所示,是乙個凸多邊形 如下圖所示,不是乙個凸多邊,因為v1v3連線落在了多邊形的外部 凸多邊形不相鄰的兩個頂點的連線稱為凸多邊形的弦 2 什麼是凸多邊形的三角剖分?凸多邊形的三...