凸多边形

凸多边形的划分

元气小坏坏 提交于 2020-04-06 12:24:44
1069. 凸多边形的划分 给定一个具有 N 个顶点的凸多边形,将顶点从 1 至 N 标号,每个顶点的权值都是一个正整数。 将这个凸多边形划分成 N−2 个互不相交的三角形,对于每个三角形,其三个顶点的权值相乘都可得到一个权值乘积,试求所有三角形的顶点权值乘积之和至少为多少。 输入格式 第一行包含整数 N,表示顶点数量。 第二行包含 N 个整数,依次为顶点 1 至顶点 N 的权值。 输出格式 输出仅一行,为所有三角形的顶点权值乘积之和的最小值。 数据范围 N≤50, 数据保证所有顶点的权值都小于109 输入样例: 5 121 122 123 245 231 输出样例: 12214884 思路: 多边形的一条边[l,r]一定会在某个三角形中,而它的边对着的点在[l+1,r-1]之间,我们看图可以发现,一个三角形可以把一个多边形分成两个多边形,以(1,7)为边,连接4的绿色三角形把图分成了[1,4]和[4,7]的多边形,由于三角形之间不能有交叉,所以左边多边形怎么划分和右边怎么划分没关系,所以区间[1,7]的多边形就分成了[1,4]和[4,7]两个多边形。 这道题很容易被想成环形DP,但其实最终的答案只有f[1,n]。因为对于(1,n)这条边的划分可以在任意[2,n-1]之间的任一点,也就是把所有情况都考虑了。 #include<bits/stdc++.h> using

求任意凸多边形面积

旧街凉风 提交于 2020-01-28 00:42:58
任意给出一个三角形ΔABC,设其顶点坐标分别为A(x 1 , y 1 ),B(x 2 , y 2 ),C(x 3 , y 3 ),那么根据线性代数的知识,ΔABC的有向面积可表示为: 给出任意一个多边形,其顶点坐标依次为(x 0 ,y 0 ),(x 1 ,y 1 ),(x 2 ,y 2 ),…,(x n ,y n )(其中n=2,3,4,…),则其面积可表示为: 故计算的函数为: double any_ploygon_area ( int x , int y , int n ) { double sum = 0 ; for ( int i = 0 ; i < n - 1 ; i ++ ) { sum += ( x [ i ] * y [ i + 1 ] - x [ i + 1 ] * y [ i ] ) ; } double square = ( fabs ( sum + ( x [ n - 1 ] * y [ 0 ] ) - ( x [ 0 ] * y [ n - 1 ] ) ) ) / 2 ; return square ; } 来源: CSDN 作者: Happig丶 链接: https://blog.csdn.net/qq_44691917/article/details/104095647

凸多边形最优三角剖分

被刻印的时光 ゝ 提交于 2019-12-05 16:51:10
相关概念 凸多边形:当一个简单多边形及其内部构成一个闭凸集时,则称该简单多边形为一个凸多边形。即凸多边形边界上或内部的任意两点所连成的直线段上所有点均在凸多边形的内部或边界上。通常,用多边形顶点的逆时针序列表示凸多边形,即 表示具有 n 条边, 的凸多边形。其中,约定 。 弦:若 与 是多边形上不相邻的两个顶点,则线段 称为多边形的一条弦。弦 将多边形分割成两个多边形 和 。 多边形的三角剖分 三角剖分 多边形的三角剖分是将多边形分割成互不相交的三角形的弦的集合 T。下图为一个凸 7 边形的两个不同的三角剖分。 在凸多边形 P 的一个三角剖分 T 中,各弦互不相交,且集合T 已达到最大,即 P 的任一不在 T 中的弦必与 T 中某一弦相交。在有 n 个顶点的凸多边形中,恰有 (n-3) 条弦和 (n-2) 个三角形。 最优三角剖分 给定凸多边形 ,以及定义在由凸多边形的边和弦组成的三角形上的权函数 w ,要求确定该凸多边形的三角剖分,使得该三角剖分所应对的权,即三角剖分中诸三角形上权之和为最小。 最优子结构性质 凸多边形的最优三角剖分问题有最优子结构性质。事实上,若凸 (n+1) 边形 ,的最优三角剖分 T 包含三角形 ,则 T 的权为三角形 的权,子多边形 和 的权之和。可以断言,由 T 确定的这两个子多边形的三角剖分也是最优的。因为若有 和 的更小权的三角剖分,将导致 T

凸多边形的划分

喜你入骨 提交于 2019-12-04 06:28:44
https://loj.ac/problem/10149 题目描述   有一个 \(N\) 个顶点的多边形,每个顶点都有一个权值,求如何划分使得划分后的 \(N-2\) 个三角形的权值乘积和最小。 思路   这题本意是要写高精度的,不过这不是重点。我们考虑用 \(f[i][j]\) 表示以 \(i\) 和 \(j\) 之间的顶点所构成的多边形的最小权值乘积和,那么我们考虑作为 \((i,j)\) 这条边,必定有一个顶点与这条边形成一个三角形,我们枚举这个点,就把这个多边形分成了两个多边形,再加上这个三角形堆答案的贡献即可。 代码 #include <bits/stdc++.h> using namespace std; typedef __int128 ll; ll read() { ll res=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9'){res=(res<<3)+(res<<1)+(ch^48);ch=getchar();} return res*w; } void write(ll x) { if(x<0){putchar('-');x=-x;} if(x>9)write(x/10); putchar(x%10+'0

旋转卡壳详解

匿名 (未验证) 提交于 2019-12-03 00:27:02
注:本文章参考自: https://blog.csdn.net/wang_heng199/article/details/74477738 基本问题为O(n)求凸n角形的 对踵点 ,而由该问题可以引申出许多的难题,他们包括: 计算距离 凸多边形直径 凸多边形宽 凸多边形间最大距离 凸多边形间最小距离 外接矩形 最小面积外接矩形 最小周长外接矩形 凸多边形直径 我们将一个多边形上任意两点间的距离的最大值定义为多边形的直径。 确定这个直径的点对数可能多于一对。 事实上, 对于拥有 n 个顶点的多边形, 就可能有 n 对“直径点对”存在。 一个多边形直径的简单例子如左图所示。 直径点对在图中显示为被平行线穿过的黑点 (红色的一对平行线). 直径用浅蓝色高亮显示。 显然, 确定一个凸多边形 P 直径的点对不可能在多边形 P 内部。 故搜索应该在边界上进行。 事实上, 由于直径是由多边形的平行切线的最远距离决定的, 所以我们只需要查询对踵点。 Shamos (1978) 提供了一个 O(n) 时间复杂度计算n点凸包对踵点对的算法。直径通过遍历顶点列表, 得到最大距离即可。 算法描述 1. 计算多边形y方向的端点,我们称之为 y m i n y m i n 和 y m a x y m a x 2. 通过 y m i n y m i n 和 y m a x y m a x 构造两条水平切线

凸多边形最优三角剖分问题

做~自己de王妃 提交于 2019-11-28 19:50:20
参考书籍《算法设计与分析》 王晓东 动态规划 1.问题描述 (注:是所有的三角形的权值之和,不是只计算边和弦的权值之和) 2.分析 3.编码实现: /** * @Author:胡家威 * @CreateTime:2011-11-10 下午12:31:16 * @Description:凸多边形的最优三角剖分 */ package ex2; public class Triangulation { private int n; // n多边形 private int [][] weight; // 边的权值数组 public Triangulation( int n) { this .n = n; this .weight = new int [n][n]; } public static void main(String[] args) { Triangulation triangulation = new Triangulation( 6 ); initTriangulation(triangulation); int n = triangulation.getN(); // 凸多边形的边数 int [][] t = new int [n][n]; // t[i][j]表示顶点{Vi-1,Vi...Vj}组成的多边形的最优三角形剖分的权值 int [][] s = new int

凸多边形最优三角剖分

…衆ロ難τιáo~ 提交于 2019-11-28 19:49:56
一、 问题描述 多边形是平面上一条分段线性的闭曲线。也就是说,多边形是由一系列首尾相接的直线段组成的。组成多边形的各直线段称为该多边形的边。多边形相接两条边的连接点称为多边形的顶点。若多边形的边之间除了连接顶点外没有别的公共点,则称该多边形为简单多边形。一个简单多边形将平面分为 3 个部分:被包围在多边形内的所有点构成了多边形的内部;多边形本身构成多边形的边界;而平面上其余的点构成了多边形的外部。当一个简单多边形及其内部构成一个闭凸集时,称该简单多边形为凸多边形。也就是说凸多边形边界上或内部的任意两点所连成的直线段上所有的点均在该凸多边形的内部或边界上。 通常,用多边形顶点的逆时针序列来表示一个凸多边形,即 P={v 0 ,v 1 ,… ,v n-1 } 表示具有 n 条边 v 0 v 1 , v 1 v 2 , … ,v n-1 v n 的一个凸多边形,其中,约定 v 0 =v n 。 若 v i 与 v j 是多边形上不相邻的两个顶点,则线段 v i v j 称为多边形的一条弦。弦将多边形分割成凸的两个子多边形 {v i ,v i+1 ,… ,v j } 和 {v j ,v j+1 ,… ,v i } 。多边形的三角剖分是一个将多边形分割成互不相交的三角形的弦的集合 T 。图 1 是一个凸多边形的两个不同的三角剖分。 图 1 一个凸多边形的 2 个不同的三角剖分 在凸多边形 P

HRBUST1662 凸多边形 题解报告

允我心安 提交于 2019-11-28 19:44:51
题目传送门 【题目大意】 有一个$n*m$的矩阵,若干个格子被涂成黑色,如果任意两个点之间的路径至少要拐两次,或者所有的黑色格子不是连通的,那么黑色格子组成的图形就不是凸多边形,试判断给出的图形是否是凸多边形。 【思路分析】 ……其实这题我一开始都没看出来怎么做 如果两个黑色的格子之间的路径不需要拐弯,那么就在这两个格子中间连一条权值为1的边,所有边都连好之后,从每一个点出发跑最短路,如果有任意两点之间的最短路大于2,那么就不是凸多边形。 【代码实现】 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #define g() getchar() 8 #define rg register 9 #define go(i,a,b) for(rg int i=a;i<=b;i++) 10 #define back(i,a,b) for(rg int i=a;i>=b;i--) 11 #define db double 12 #define ll long long 13 #define il inline 14 #define pf printf 15 #define sf scanf 16

凸多边形最优三角剖分

笑着哭i 提交于 2019-11-26 12:29:48
相关概念 凸多边形:当一个简单多边形及其内部构成一个闭凸集时,则称该简单多边形为一个凸多边形。即凸多边形边界上或内部的任意两点所连成的直线段上所有点均在凸多边形的内部或边界上。通常,用多边形顶点的逆时针序列表示凸多边形,即 表示具有 n 条边, 的凸多边形。其中,约定 。 弦:若 与 是多边形上不相邻的两个顶点,则线段 称为多边形的一条弦。弦 将多边形分割成两个多边形 和 。 多边形的三角剖分 三角剖分 多边形的三角剖分是将多边形分割成互不相交的三角形的弦的集合 T。下图为一个凸 7 边形的两个不同的三角剖分。 在凸多边形 P 的一个三角剖分 T 中,各弦互不相交,且集合T 已达到最大,即 P 的任一不在 T 中的弦必与 T 中某一弦相交。在有 n 个顶点的凸多边形中,恰有 (n-3) 条弦和 (n-2) 个三角形。 最优三角剖分 给定凸多边形 ,以及定义在由凸多边形的边和弦组成的三角形上的权函数 w ,要求确定该凸多边形的三角剖分,使得该三角剖分所应对的权,即三角剖分中诸三角形上权之和为最小。 最优子结构性质 凸多边形的最优三角剖分问题有最优子结构性质。事实上,若凸 (n+1) 边形 ,的最优三角剖分 T 包含三角形 ,则 T 的权为三角形 的权,子多边形 和 的权之和。可以断言,由 T 确定的这两个子多边形的三角剖分也是最优的。因为若有 和 的更小权的三角剖分,将导致 T