PTA算法题:凸多边形最优三角剖分

给定n边凸多边形P,要求确定该凸多边形的三角剖分(将多边形分割成n-2个三角形),使得该三角剖分中诸三角形上权之和为最小。各边弦的权值以由输入数据给出,以无向图的形式表示。三角形的权值等于三条边权值相加。

 

输入格式:

第一行输入凸多边形的边数n(3<=n<=8)

第二行起,输入顶点i(1<=i<=n)到顶点j(i<=j<=n)组成的边或弦的权值

输出格式:

最优三角剖分中诸三角形上权值和。

输入样例:

6
0 2 2 3 1 4
0 1 5 2 3
0 2 1 4
0 6 2
0 1
0

输出样例:

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 = 1; i <= N; i++){
//		for(int j  = 1; j <= N; j++){
//			cout <<  array[i][j] << ' ';
//		}
//		cout << endl;
//	}
	
	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;
				} 
			} 
		}
	} 
	
	
//	for(int i = 1; i < N; i++){
//		for(int j = 1; j < N; j++){
//			cout << m[i][j] << ' ';
//		}
//		cout << endl; 
//	}
	
//	cout << C_triangle(4,5,6); 
	
	cout << m[1][N-1];
	
} 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值