凸多边形最优三角剖分
问题描述
给定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];}