假设N个点的凸多边形,点编号为V1, V2, .. Vn,若在Vk处将原凸多边形划分为一个三角形V1VkVn,两个子凸多边形V1,V2,...,Vk和Vk, Vk+1, .....Vn。到一个最优的剖分方案,则该最优剖分方案应该包含这两个子凸多边形的最优剖分方案。用m[i][j]表示点Vi-1,Vi….Vj构成的凸多边形的最优剖分方案的权重,s[i][j]记录剖分该凸多边形的k值。
则:
其中,W(Vi-1,VkVj)=Wi-1,k+Wk,j+Wj,i-1为三角形Vi-1VkVj的权重,Wi-1,Wk,j,Wj,i-1分别为该三角形三条边的权重。
求解凸多边形的最优剖分方案,即求解最小剖分的权重及对应的三角形集。
C代码
#includestdio.h>
#define N 6//凸多边形规模
int m[N+1][N+1];//m[i][j]表示多边形Vi-1到Vj最优三角剖分的权值
int s[N+1][N+1];//s[i][j]记录多边形Vi-1到Vj最优三角剖分的k 值
int w[N+1][N+1];//凸多边形的权重矩阵,在main函数中输入
/*三角形的权重a,b,c,三角形的顶点下标*/
int get_triangle_weight(int a, int b, int c){
return W[a][b]+W[b][c]+W[c][a];
}
/*求解最优值*/
void triangle_partition(){
int i,r,k,j;
int temp;
/*初始化*/
for(i=1;i=N;i++){
m[i][j]=0;
}
/*自底向上计算m,S*/
for(r=2; ( 1 ); r++){ /*r为子问题规模*/
for(i=1; K=N-r+1; i++){
( 2 )
m[i][j]=m[i][j] + m[i+1][j] +get_triangle_weight(i-1,i,j); /*k=j*/
S[i][j]=i;
for(k=i+1; k