草庐IT

7-3 凸多边形最优三角剖分 (10 分)(思路+详解+分析题意+动态规划)Come Baby!!!!!!!!!

天天向上的菜鸡杰!! 2024-06-23 原文

一:题目:

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

二:分析题意:

有没有兄弟搞不清题目当中 使得该三角剖分中诸三角形上权之和为最小这句话,反正我是读了几十遍,没读懂
后来看了一篇博客,上面给解释了,这个也就是当将凸多变形剖分完成后,求取所有三角形的周长和使其最小

三:思路:

1.凸多边形的三角剖分是将凸多边形分割成互不相交的三角
形的弦的集合。
2.最优三角剖分中诸三角形上权值和:指的是将多边形划分成多个三角形
其所有的三角形的周长和最小
3.和矩阵连相乘的思路比较:凸三角形的剖分是通过一个三角形将多边形划分成不同的两部分和一个三角形。
联想矩阵链的递推方程:将其划分成两个不同的子链+这两个自链所构成的矩阵乘法次数

相同点:两种思路一致,
不同点:矩阵连计算次数是 pi-1 * pK* pj
多变形是 三边之和

4.关于递推方程:t[i][j] = t[i][k] + t[k+1][j] + w(i-1,k,j);
这里需要说明的是t[i][j]即表示的是多边形的剖分最小权值和(所有三角形的)
比如t[1][6] = t[1][1] + t[2][6] + w(0,1,6), (7个顶点)
通过点0,1,6将多边形剖分成三部分
其中t[1][1] = 0(三角剖分中 只有一条边的是不可以 被剖分成 多边形的 故其权值和为0)
t[2][6] 表示的是剩下的多变形,然后再求取它的最小值

通过这样的分析:我们可以得知 t[2][6],也就相当于矩阵连相乘问题中的
子链,那么我就还是可以通过建网格来存储每个多边形的最小权值和
来进行求解
5.本题题解:
通过上述分析我们可以得出:
求取凸多边形最优三角剖分 = t[1][n - 1];
6:这里有一张图是 将 矩阵链中的矩阵映射在凸多变形的边上,方便兄弟们更容易理解算法

四:上码:

/**
	分析: 
	1.凸多边形的三角剖分是将凸多边形分割成互不相交的三角
	  形的弦的集合。
	2.最优三角剖分中诸三角形上权值和:指的是将多边形划分成多个三角形
	                                  其所有的三角形的周长和最小
	3.和矩阵连相乘的思路比较:凸三角形的剖分是通过一个三角形将多边形划分成不同的两部分
							和一个三角形。
		联想矩阵链的递推方程:将其划分成两个不同的子链+这两个自链所构成的矩阵乘法次数
		
		相同点:两种思路一致,
		 不同点:矩阵连计算次数是 pi-1 * pK* pj 
				 多变形是 三边之和	
				 
	4.关于递推方程:t[i][j] = t[i][k] + t[k+1][j] + w(i-1,k,j);
	   这里需要说明的是t[i][j]即表示的是多边形的剖分最小权值和(所有三角形的)
	   比如t[1][6] = t[1][1] + t[2][6] + w(0,1,6),
	   通过点0,1,6将多边形剖分成三部分
	   其中t[1][1] = 0(三角剖分中 只有一条边的是不可以 被剖分成  多边形的 故其权值和为0)
	       t[2][6] 表示的是剩下的多变形,然后再求取它的最小值
	  
	  通过这样的分析:我们可以得知 t[2][6],也就相当于矩阵连相乘问题中的
	  				  子链,那么我就还是可以通过建网格来存储每个多边形的最小权值和
					  来进行求解
	5.本题题解:
	   通过上述分析我们可以得出: 
	  求取凸多边形最优三角剖分 = t[1][n]; 
	 				  			   						  
*/ 

#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];
	
} 


加油陌生人!我们共勉!如有疑问请留言!

有关7-3 凸多边形最优三角剖分 (10 分)(思路+详解+分析题意+动态规划)Come Baby!!!!!!!!!的更多相关文章

  1. 由于 libgmp.10.dylib 的问题,Ruby 2.2.0 无法运行 - 2

    我刚刚安装了带有RVM的Ruby2.2.0,并尝试使用它得到了这个:$rvmuse2.2.0--defaultUsing/Users/brandon/.rvm/gems/ruby-2.2.0dyld:Librarynotloaded:/usr/local/lib/libgmp.10.dylibReferencedfrom:/Users/brandon/.rvm/rubies/ruby-2.2.0/bin/rubyReason:Incompatiblelibraryversion:rubyrequiresversion13.0.0orlater,butlibgmp.10.dylibpro

  2. ruby - ri 有空文件 – Ubuntu 11.10, Ruby 1.9 - 2

    我正在运行Ubuntu11.10并像这样安装Ruby1.9:$sudoapt-getinstallruby1.9rubygems一切都运行良好,但ri似乎有空文档。ri告诉我文档是空的,我必须安装它们。我执行此操作是因为我读到它会有所帮助:$rdoc--all--ri现在,当我尝试打开任何文档时:$riArrayNothingknownaboutArray我搜索的其他所有内容都是一样的。 最佳答案 这个呢?apt-getinstallri1.8编辑或者试试这个:(非rvm)geminstallrdocrdoc-datardoc-da

  3. ruby-on-rails - gem install rmagick -v 2.13.1 错误 Failed to build gem native extension on Mac OS 10.9.1 - 2

    我已经通过提供MagickWand.h的路径尝试了一切,我安装了命令工具。谁能帮帮我?$geminstallrmagick-v2.13.1Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingrmagick:ERROR:Failedtobuildgemnativeextension./Users/ghazanfarali/.rvm/rubies/ruby-1.8.7-p357/bin/rubyextconf.rbcheckingforRubyversion>=1.8.5...yescheckingfor/

  4. ruby - 安装 tiny_tds 在 mac os 10.10.5 上出现错误 - 2

    我正在使用macos,我想使用ruby​​驱动程序连接到sqlserver。我想使用tiny_tds,但它给出了缺少free_tds的错误,但它已经安装了。怎么能过这个?~brewinstallfreetdsWarning:freetds-0.91.112alreadyinstalled~sudogeminstalltiny_tdsBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtiny_tds:ERROR:Failedtobuildgemnativeextension.完整日志如下:/System

  5. ruby - rails 3.2.2(或 3.2.1)+ Postgresql 9.1.3 + Ubuntu 11.10 连接错误 - 2

    我正在使用PostgreSQL9.1.3(x86_64-pc-linux-gnu上的PostgreSQL9.1.3,由gcc-4.6.real(Ubuntu/Linaro4.6.1-9ubuntu3)4.6.1,64位编译)和在ubuntu11.10上运行3.2.2或3.2.1。现在,我可以使用以下命令连接PostgreSQLsupostgres输入密码我可以看到postgres=#我将以下详细信息放在我的config/database.yml中并执行“railsdb”,它工作正常。开发:adapter:postgresqlencoding:utf8reconnect:falsedat

  6. ruby-on-rails - 在 osx 10.9.3 上使用 RVM 安装 ruby​​-1.9.3-p547 时出错 - 2

    如何解决这个错误:$rvminstall1.9.3Searchingforbinaryrubies,thismighttakesometime.Nobinaryrubiesavailablefor:osx/10.9/x86_64/ruby-1.9.3-p547.Continuingwithcompilation.Pleaseread'rvmhelpmount'togetmoreinformationonbinaryrubies.Checkingrequirementsforosx.Certificatesin'/usr/local/etc/openssl/cert.pem'arealr

  7. u盘安装系统(win10为例) - 2

    下载微PE工具箱进入官网下载微PE工具箱-下载 安装好后,打开微PE工具箱客户端,选择安装PE到U盘 PE壁纸可选择自己喜欢的壁纸,勾选上包含DOS工具箱,个性化盘符图标 下载原版系统进入网站下载镜像NEXT,ITELLYOU如果没有账号,注册一下就好进入选择开始使用选择win10 这里我们选择消费者版,用迅雷把BT种子下载下来 下面的两个盘符,是PE工具箱安装进U盘后,分成的盘符,注意EFI的盘符,这里面不能删东西,也不能添东西,另一个盘符可以当做正常的U盘空间使用,我们现在需要把下载下来的景象文件复制到正常的U盘空间中去 这个时候我们的系统U盘就只做好了 安装系统我们将U盘插入电脑,开机,

  8. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  9. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  10. ruby-on-rails - OSX 10.7.5 - Ruby on Rails LoadError : Could not open library 'sodium' : dlopen(sodium, 5) - 2

    输入rakedb:create后我得到:LoadError:Couldnotopenlibrary'sodium':dlopen(sodium,5):imagenotfound.Couldnotopenlibrary'libsodium.dylib':dlopen(libsodium.dylib,5):imagenotfound这里还有一些输出。/Users/Mao/.rvm/gems/ruby-2.0.0-p451/gems/ffi-1.9.3/lib/ffi/library.rb:133:in`blockinffi_lib'/Users/Mao/.rvm/gems/ruby-2.0

随机推荐