凸多边形最优三角剖分
凸多边形最优三角剖分
问题描述
给定n边凸多边形P,要求确定该凸多边形的三角剖分(将多边形分割成n-2个三角形),使得该三角剖分中诸三角形上权之和为最小。各边弦的权值以由输入数据给出,以无向图的形式表示。三角形的权值等于三条边权值相加。
输入格式
第一行输入凸多边形的边数\(n(3\leqslant n \leqslant 8)\)
第二行起,输入顶点\(i(1\leqslant i\leqslant n)\)到顶点\(j(i\leqslant j\leqslant n)\)组成的边或弦的权值
输出格式
最优三角剖分中诸三角形上权值和。
测试样例
Sample Input
6
0 2 2 3 1 4
0 1 5 2 3
0 2 1 4
0 6 2
0 1
0
Sample Output
24
问题分析
参考代码
#include<bits/stdc++.h>
using namespace std;
int array1[200][200];
//剖分三角形的周长
int C_triangle(int i,int k,int j){
return array1[i][k] + array1[k][j] + array1[i][j];
}
int main(){
int N;
cin >> N;
int m[200][200];
//比如有7个顶点(v0,v1..v6),我们数组中存的是边长和弦长
for(int i = 0; i < N; i++){
for(int j = i; j < N; j++){
cin >> array1[i][j];
}
}
for(int i = 0; i <= N; i++){
m[i][i] = 0;
}
for(int i = N - 1; i >= 1; i--){
for(int j = i+1; j <= N - 1; j++){//这里j从i+1开始,因为从i开始每次m[i][i] = 0; 这里j <= N 表示的是这一行到最后比如m[i][N]
//初始化二维数组
m[i][j] = m[i][i] + m[i+1][j] + C_triangle(i-1,i,j);
for(int k = i+1; k < j; k++){
int temp = m[i][k] + m[k+1][j] + C_triangle(i-1,k,j);
if(temp < m[i][j]){
m[i][j] = temp;
}
}
}
}
cout << m[1][N-1];
}

浙公网安备 33010602011771号