动态规划之凸多边形最优三角剖分”

 问题描述
多边形是平面上一条分段线性的闭曲线。也就是说,多边形是由一系列首尾相接的直线段组成的。组成多边形的各直线段称为该多边形的边。多边形相接两条边的连接点称为多边形的顶点。若多边形的边之间除了连接顶点外没有别的公共点,则称该多边形为简单多边形。一个简单多边形将平面分为3个部分:被包围在多边形内的所有点构成了多边形的内部;多边形本身构成多边形的边界;而平面上其余的点构成了多边形的外部。当一个简单多边形及其内部构成一个闭凸集时,称该简单多边形为凸多边形。也就是说凸多边形边界上或内部的任意两点所连成的直线段上所有的点均在该凸多边形的内部或边界上。

 解题思路与算法思路

多边形: 平面上一条分段线性闭曲线。即 一系列首尾相接的直线段所组成的。
▪ 通常用多边形顶点的逆时针序列表示 凸多边形,即 P = { v0,v1,…,vn-1 } 表示具有n条边,v0,v1,…,vn,其中,约定 v0 = vn。
▪ 若 vi与vj 是多边形上不相邻的两个顶点,则线段vivj称为多边形的一条弦。且弦vivj将多边形分割成两个不同的三角剖分。
▪ 凸多边形最优三角剖分问题:给定凸多边形 P = { v0,v1,…,vn-1 },以及定义在由凸多边形的边和絃组成的三角形上的权函数w。要求确定该凸多边形的三角剖分,使得该三角剖分所对应的权,即三角剖分中诸三角形上权之和为最小。

 程序模型的建立
通过状态转移方程递归求解

 数据结构的选用
选择数组储存

 程序设计流程
输入
储存数据
递归求值
 程序设计伪码算法

for(int k = i+1 ;k<j ;k++)
	{
		tem = find_max(i,k)+find_max(k,j)+value[i][k]+value[i][j]+value[j][k] ;
		if(tem>sum)
		{
			sum = tem ;
		}
	}

 源程序编码清单

#include<iostream>
#include<string>
#include<vector>
#include<utility> 
#define N 100

int value[N][N] = {0} ;
int mark[N][N] = {0}   ; 
int get_distance(std::pair<int ,int >a ,std::pair<int ,int >b) ; 
int find_max(int i ,int j) ;
int main()
{
	int n ;
	scanf("%d",&n) ;
	//std::vector< std::pair<int,int> > pos ;
	//input the pos 
	/*for(int i = 0 ;i<n ;i++)
	{
		int temx ;
		int temy ;
		scanf("%d",&temx) ;
		scanf("%d",&temy) ;
		pair tem_pos = make_pair(temx ,temy) ;
		pos.push_back(tem_pos) ;
	}*/
	//get the value
	int tem ;
	for(int i = 0 ;i<n ;i++)
		for(int j = 0 ; j<n ;j++)
		{
			scanf("%d",&tem) ;
			value[i][j] =tem   ;// get_distance(pos[i],pos[j]])
		}
	printf("%d",find_max(0,n-1)) ;
} 
//int get_distance(std::pair<int ,int >a ,std::pair<int ,int >b) 
//{
	//return (a.first-b,first)*(a.first-b,first)+(a.second - b.second)*(a.second - b.second) ;
//}
int find_max(int i ,int j)
{
	if(mark[i][j]!=0)
	{
		return mark[i][j] ;
	}
	std::cout<<"salkdsa"<<std::endl ;
	printf("%d,%d\n",i , j) ;
	if(j-i<2)
	{
		return 0 ;
	}
	int sum = 0 ;
	int tem  = 0 ;
	for(int k = i+1 ;k<j ;k++)
	{
		tem = find_max(i,k)+find_max(k,j)+value[i][k]+value[i][j]+value[j][k] ;
		if(tem>sum)
		{
			sum = tem ;
		}
	}
	mark[i][j] =sum ;
	return sum ;
	
	
} 

 程序输入、输出

输入:
6
0 2 2 3 1 4 
2 0 1 5 2 3
2 1 0 2 1 4
3 5 2 0 6 2
1 2 1 6 0 1
4 3 4 2 1 0
输出:
	36

输入输出文件,或程序运行结果截图
《动态规划之凸多边形最优三角剖分”》
 时间与空间复杂度分析
时间复杂度是n^3
空间复杂度是n^3 ;
 程序使用说明

 总结与完善

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注