Title

凸多边形最优三角剖分

凸多边形最优三角剖分

问题描述

给定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];

} 

复杂度分析

时间复杂度分析

空间复杂度

posted @ 2024-12-21 12:42  是胡某某啊  阅读(71)  评论(0)    收藏  举报