動態規劃DP 凸多邊形最優三角剖分

2021-09-28 16:38:33 字數 2299 閱讀 3354

我們可以把披薩餅看作是乙個凸多邊形,凸多邊形是指多邊形的任意兩點的連線均落在多邊形的內部或邊界上。

(1)什麼是凸多邊形?

如下圖所示,是乙個凸多邊形

如下圖所示,不是乙個凸多邊,因為v1v3連線落在了多邊形的外部

凸多邊形不相鄰的兩個頂點的連線稱為凸多邊形的弦

(2)什麼是凸多邊形的三角剖分?

凸多邊形的三角剖分是指將乙個凸多邊形分割成互不相交的三角形的弦的集合。如下圖所示,都是三角形的剖分,三角形的剖分有很多種:

如果我們在給定凸多邊形及定義在邊,弦上的權值,即任意兩點之間定義乙個數值作為i權值,如圖所示:

三角形上權值之和是指三角形的3條邊上的權值之和:

w(vi vk vj)=|vi vk| + |vk vj | + |vi vj| 

如圖所示,w(v0v1v4)=|v0v1| + |v1v4| + |v0v4| = 22+8+5=15.

(3)什麼是凸多邊形最優三角剖分?

乙個凸多邊形的三角剖分有很多種,最優三角剖分就是劃分的各三角形上權函式之和最小的三角剖分。

凸多邊形最優三角剖分滿足動態規劃的最優子結構性質,可以從自底向上逐漸推出整體的最優。

(1)確定合適的資料結構

採用二維陣列g[ ][ ]記錄各個頂點之間的連線權值,二維陣列m[ ][ ]存放各個子問題的最優值,二維陣列s[ ][ ]存放各個子問題的最優策略。

(2)初始化

輸入頂點數n,然後依次輸入各個頂點之間的連線權值儲存在二維陣列g[ ][ ]中,令n=n-1(頂點標號從v0開始),

m[i][i]=0,s[i][i]=0,其中i=1,2,3,4……,n-1。

(3)迴圈

(4)構造最優解

根據最優決策資訊陣列s[ ][ ]遞迴構造最優解,即輸出凸多邊形的最優剖分的所有弦。s[1][n],表示凸多邊形最優三角剖分位置。

int n; //頂點數

int s[m][m];//記錄最優策略二維陣列

double m[m][m];//記錄最優值二維陣列

double g[m][m];//記錄各頂點之間權值的二維陣列

void convex_polygon_triangulation()

for(int d=2;d<=n;d++)//d為問題規模,d=2實際上有三個點}}

}}void print (int i,int j) //遞迴求解所有子問題的弦。

" << endl;

}if(s[i][j]+1> n;

n--;

cout << "請依次輸入各頂點的連線權值:" << endl;

for (i=0;i<=n;++i)

}convex_polygon_triangulation();

cout << "最優三角剖分的權值和是:" << endl;

cout << m[1][n]<< endl;

cout << "頂點的集合是:"<< endl;

凸多邊形最優三角剖分 動態規劃

解答 題目中頂點座標編號從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 ...

凸多邊形最優三角剖分 動態規劃

凸多邊形最優分割是典型的動態規劃問題 凸多邊形最優剖分 給定凸多邊形,以及定義在由多邊形的邊和弦上的權函式,使得該多邊形三角剖分後所有三角形權值之和最小。思路 先將多邊形三角剖分 2 三角剖分 最優子結構性質 若n 1邊形的最優三角剖分包含三角形v0vkvn 1 k n 則t的權為三個部分權之和 三...

動態規劃 凸多邊形最優三角剖分

在這裡,權值可以是任何和弦長,邊長有關的權函式,一般來說,我們使用三角形的邊長作為權值。在這個問題中,是具有最優子結構的。設一共有n邊的凸多邊形點的集合為,在以v0和vn 1為底的情況下,求k 0,n 1 使v0,vn 1,vk組成的三角形權值最小。這樣,剩下的兩個點集和就可以組成新的凸多邊形。在其...