UVa 1331 最大面积最小的三角剖分(dp)

例题9-11 UVa1331 Minimax Triangulation(DP:最优三角剖分) 题意: 看白书 要点: 基本的三角剖分题,但要注意三个点: 1.已知三角形三个顶点的坐标,可用行列式求面积,则S=(1/2)*(下面行列式) |x1 y1 1| |x2 y2 1| |x3 y3 1| S=(1/2)*(x1y2*1+x2y3*1+x3y1*1-x1y3*1-x2y1*1-x3y2*1) 2.这题没有说多边形一定是凸多边形,所以要考虑凹多边形的情况, 阅读详情

这里写图片描述
一共有4条边,我们可以以随意的顺序切割,不过如果这样的话,就会出现类似v0v3v4v6这样的多边形,这样的多边形很难用简洁的状态表示出来,这就是让我一开始很纠结的地方。

其实我们会发现,对于同一种切割方法,我们可以有多种切割顺序,但我们只要计算一种就好了,不如把决策顺序规范化。例如还是上面第一张图,我们可以先切割出三角形v0v3v6,那么我们切割完之后可以把图分割成一个三角形和两个多边形,而组成这两个个多边形的点的编号都是连续的。

于是我们可以得出一种切割方法,比如我要切割多边形i,i+1,…,j-1,j(i < j),那么我下一步切割的三角形一定有i和j这两个点(这样的规定并不会出错,因为无论我们如何切割,分出来的三角形中一定有一个过i和j),而这样的切割方法的优点是保证了每次切出来的多边形组成的点的编号都是连续的,于是我们就可以用两个元素表示一个多边形的状态了,这样dp转移方程很容易可以得出来:

d(i,j)=min{max(d(i,k),d(k,j),S(i,j,k))|i < k< j};

其中,S(i,j,k)为三角形i-j-k的面积。不过此时需要保证i-j是对角线(唯一的例外是i=0且j=n-1),具体做法是当边i-j不满足条件时直接设为INF,其他部分和凸多边形的情形完全一样。

这里用海伦公式计算三角形面积
用面积差判断三角形内部是否有点
明确了这些进行dp
最后答案在d[1][N]中
d[i][j]表示的是以i,j为边界不包含序号1的点的多边形里最大三角形面积最小值

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;

#define MAXN 50
#define INF 0x7fffffff
#define eps 0.0001
struct point
{
    double x,y;
}p[MAXN+5];//点
int N;
double d[MAXN+5][MAXN+5];//动归

double dis(int x,int y){return sqrt((p[x].x-p[y].x)*(p[x].x-p[y].x)+(p[x].y-p[y].y)*(p[x].y-p[y].y));}//计算两点距离
double area(int x,int y,int z)//计算由点x,y,z构成的三角形的面积(海伦公式)
{
    double a=dis(x,y),b=dis(y,z),c=dis(x,z);
    double p=(a+b+c)/2;
    return sqrt(p*(p-a)*(p-b)*(p-c));
}
bool check(int x,int y,int z)//判断由点x,y,z构成的三角形中有没有点
{
    double tarea=area(x,y,z);
    for(int i=1;i<=N;i++)
    {
        if(i==x||i==y||i==z) continue;
        double a=area(i,x,y),b=area(i,y,z),c=area(i,x,z);
        if(fabs(a+b+c-tarea)<eps)//double计算有精度误差,不要用==
            return 0;
    }
    return 1;
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&N);
        for(int i=1;i<=N;i++)
            scanf("%lf%lf",&p[i].x,&p[i].y);
        for(int i=N-2;i>=1;i--)//从大到小选取第一个点
            for(int j=i+2;j<=N;j++)//选择第二个点
            {
                d[i][j]=INF;
                for(int k=i+1;k<j;k++)//选择两点中间分割点
                    if(check(i,j,k))
                        d[i][j]=min(d[i][j],max(area(i,j,k),max(d[i][k],d[k][j])));
            }
        printf("%.1lf\n",d[1][N]);
        memset(d,0,sizeof(d));
    }
}
区间DP_最优三角剖分 最优三角剖分有很多种类型,如:求让所有三角形权值和最大的方案、所有三角形权值和最小的方案、所有三角形最大三角形面积最小的方案........但是不论怎么变化,他们的解题思路都是相同的,只是状态转移方程有些许的差别而已,首先我们先看第三种情况.......栗子:UVA 1331本题主要思路以及图片多参考自博客:https://blog.youkuaiyun.com/c20190102/article/detai... 阅读详情

相关推荐

动态规划实现的最小化三角剖分算法

Easy3D 基于动态规划的最小化三角剖分算法能够实现高效、准确的三角剖分过程,同时能够保证剖分后三角形的数量最少。综上所述,Easy3D 基于动态规划的最小化三角剖分算法能够帮助计算机图形学领域的专业人士更加高效地进行三角剖分,提高工作效率和准确性。三角剖分是计算机图形学中常用的一个概念,指将多边形分割成若干个三角形的过程。在计算机图形学中,三角剖分算法的效率和准确性非常重要。以上是核心代码部分,需要注意的是,这段代码中使用了递归和记忆化搜索来优化三角剖分过程,从而实现了高效、精确的结果。

2301_79331421的博客 202

UVA 1331 Minimax Triangulation 最大面积最小的三角剖分(区间dp--记忆化搜索)

大大体题意: 给你一个n 个点的多边形,输入按着沿着边输入(不用排序),要求分成n-2个三角形,使得这n-2个三角形中最大的三角形的面积尽可能小,输出最小面积! 思路: 区间dp思想! 令dp[i][j] 是用第i 个点到第j 个点能组成最大三角形最小面积! 然后枚举i 和j 之间的点作为 第三个点,然后分成两部分 i~k 和k~j 继续寻找! 不过有坑: 需要注意,如果有个点凹进去

aozil_yang的博客 672

多边形转三角形算法

在做三维绘制的过程中,需要动态的绘制的多边形,但是如果直接将多边形的顶点连接起来绘制(GL_POLYGON)显示是有问题的,必须要将多边形三角形化,才能正确绘制且显示正常

计算几何【三角剖分】

在数学和计算几何中,对于给定的平面中的离散点集PPP,其 Delaunay 三角剖分 DT(PPP空圆性:DT(PPP) 是唯一的(任意四点不能共圆),在 DT(PPP) 中,任意三角形的外接圆范围内不会有其它点存在。最大化最小角:在点集PPP可能形成的三角剖分中,DT(PPP) 所形成的三角形的最小角最大。从这个意义上讲,DT(PPP) 是最接近于规则化的三角剖分。具体的说是在两个相邻的三角形构成凸四边形的对角线,在相互交换后,两个内角的最小角不再增大。

m0_52796585的博客 1471

UVA1131 最优三角形剖分

UVA1131 最优三角形剖分 最优三角剖分的一类题目都是差不多的。给你一个多边形,让你把它分割成若干个三角形,求三角形某最优解,比如UVA1331要求面积最大的三角形的面积最小。

华为开发岗暑期实习笔试(2025年4月16日)

第一题怀疑测试样例不完整,贪心法不应该能够解决该题。第二题使用0-1BFS解决单源最短路径的问题,往往搭配双端队列实现。第三题是运用动态规划解决最大不重叠子区间个数的问题,难点在于满足3重判断规则,所需数据结构及相关操作较多。

csy031117的博客 3663

多边形三角化算法

几个约定 多边形的点数组都是有序和有方向的。GIS数据的多边形,一般都是逆时针方向,我们约定多边形都是逆时针方向,多边形内的岛屿则是顺时针方向。 多边形的点数组是不闭合的,如果首尾两个顶点重合去掉一个。 多边形仅二维的,当然三维点数组也能描绘一个曲面,只是过程判断略有不同,暂不作讨论 多边形外圈只有一个,且没有任何线段相交。 内圈可以是多个,内圈没有任何线段相交。 内圈之间,不能相互重...

higter的专栏 4623

使用ADS进行LNA低噪放设计的详细教程

详细介绍了通过ADS软件进行LNA设计的过程,从晶体管的选型到稳定性系数分析、再到输入输出端匹配,完整的讲解了低噪放的设计流程,可以使新手小白以及学习射频放大器的朋友可以快速的了解掌握ADS的使用方法和LNA的设计方法。

weixin_41831333的博客 3450

UVA1331 Minimax Triangulation (区间DP)

UVA1331 Minimax Triangulation (区间DP) 本题属于最优三角剖分问题,用dp(i,j)表示在编号为i的顶点和编号为j的顶点间的最大三角面积的最小值。 这样我们就可以得到状态转移方程 dp(i,j)=min(max(dp(i,k),dp(k,j),S(i,k,j))),其中i<k<j 知道三角形的三点坐标,可以用向量叉乘来求面积; 知道三角形的三边长,可以用海伦公式求面积; 本题需要注意的地方是,需要判断i-j是否是多边形的对角线(除了i=1且j=n的情况),我们可以

WedsonLin的博客 320

echarts的坐标轴处理算法

参考原文:https://www.cnblogs.com/vicky-li/p/11653415.html。2、可用于双轴的情况,指定splitNumber,保证左右两边的线没有交叉显示的情况。1、设置echarts显示的最大最小值,让数据显示比较有起伏。处理echarts的一些问题。

HYeeee的博客 801

基于RK3588与Gstreamer的端侧实时视频流AI推理系统构建

本文详细介绍了基于RK3588芯片与Gstreamer框架构建端侧实时视频流AI推理系统的完整方案。通过硬件选型、环境配置、OpenCV编译优化、视频流处理实战及模型部署等关键环节的深入解析,展示了如何利用RK3588的6TOPS NPU算力与Gstreamer的低延迟特性,实现工业质检、智能交通等场景下的高效边缘计算。特别针对RTSP推拉流优化、RKNN模型转换等核心技术难点提供了实用解决方案。

weixin_30516243的博客 382

【计几】最优三角剖分

最优三角剖分 内容: 我们定义一个多边形的剖分对应的权值函数,那么最优三角剖分就是找权值函数的最小值。 思路: 一般做法是区间DP。需要注意的是,如果多边形有可能是凹多边形的话,枚举中间值 kkk 就会存在非法的剖分,要特别判断一下。 详细解释:【动态规划】UVa 1331 最大面积最小三角形剖分 ...

ZhgDgE的博客 227

Claude Code 完整使用教程(2026最新版)

《Claude Code 完整使用教程(2026最新版)》摘要: Claude Code 是 Anthropic 公司推出的智能编程工具,通过自然语言对话实现代码编写、调试和重构。本教程基于 v2.1.101 版本,涵盖安装配置、核心功能及最新特性。主要内容包括: 多平台安装方式(macOS/Linux/Windows) 桌面应用专属功能如并行会话、定时任务和语音模式 模型选择指南(Sonnet/Opus/Haiku) 快速入门示例:5分钟创建Node.js项目 核心功能:代码读写、命令执行、Git集成等

程序猿_三产 2万+

UVa 1331 最大面积最小的三角剖分

题意:输入一个多边形(不一定是凸包),找一个最大三角形面积最小的三角剖分,输出最大三角形的面积。 分析:最优三角剖分。dp[i][j]表示从i点到j点的最优值,枚举中间点k。转移方程为dp[i][j]=min(dp[i][j],max(area(i,j,k),max(dp[i][k],dp[k][j])))。但是题目中给的不一定是凸多边形,则在对任意一个子多边形,如果有任意一个对角线i, j 和...

常胜将军的博客 429

Android应用发布到Google Play的步骤和注意事项

发布Android应用到Google Play是将您的应用分享给全球用户的重要步骤。Google Play是Android平台上最大的应用分发渠道之一,使得开发者可以轻松将他们的应用推广到数百万的用户。在本篇博客中,我们将逐步介绍如何将您的Android应用发布到Google Play,同时提供详细的步骤和注意事项,以及相关的代码示例。

2201_76125261的博客 850

GEE:随机森林分类教程(样本制作、特征添加、训练、精度、参数优化、贡献度、统计面积)

本文将介绍在Google Earth Engine (GEE)平台上进行随机森林分类的方法和代码,其中包括制作样本点教程(本地、在线和本地在线混合制作样本点,合并样本点等),加入特征变量,运行随机森林分类器教程,计算随机森林分类结果的精度,优化随机森林分类算法的参数,打印各个变量特征的贡献度等步骤的方法和代码。本教程可以应用于多种分类场景,包括土地利用分类、种植区提取(大蒜、小麦、玉米等)、局部气候区分类、植被分类等多种场景。

养乐多的博客 1万+

UVa 1331 Minimax Triangulation

该题目要求对简单多边形进行三角剖分,使得最大三角形面积最小化。采用动态规划方法,定义状态dp[i][j]表示顶点i到j的子多边形剖分后的最小最大面积。通过枚举中间顶点k,将多边形划分为三角形(i,k,j)和两个子多边形,利用状态转移方程求解。关键点是确保三角形(i,k,j)内部不包含其他顶点。算法时间复杂度为O(m³),适用于顶点数m<50的情况,最终输出保留一位小数的最小最大面积。

寂静山林 934

Qt实现窗口等比例缩放

在Qt中,实现窗口的等比例缩放是一个常见的需求。通过对窗口的尺寸进行调整,使得窗口的内容在缩放过程中保持相同的比例,可以提供更好的用户体验。通过以上的代码,我们实现了一个可以等比例缩放的Qt窗口。在调整窗口大小时,窗口中的标签和按钮将按比例缩放,保持内容的比例不变。首先,我们需要在Qt中创建一个窗口,并设置其内容。在该事件中,我们将根据窗口的新尺寸计算出合适的比例因子,并将其应用到窗口的内容上。现在,我们将添加功能,使得窗口可以等比例缩放。最后,我们将缩放因子应用到窗口中的标签和按钮上,调整它们的尺寸。

2301_79330511的博客 3959

Uva1331最优三角剖分

题意: 输入一个多边形,找一个最大三角形面积最小的三角剖分,输出最大三角形的面积。 思路:区间DP dp[i][j]表示从i点到j点的最优值,枚举中间点k。 转移方程为dp[i][j]=min(dp[i][j],max(area(i,j,k),max(dp[i][k],dp[k][j])))。 注意需要检验选的这个 k 是否有效,如果i-k或j-k两个对角线的任意一条与其他边相交,那么这个k就不能...

CY05627的博客 355

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

最优三角剖分 ZOJ3537 && UVA1331

UVA1331 题解 dp[i][j]表示从区间[i,j]最大三角形的最小值,中间找一点k。 状态转移为:dp[i][j] = min(dp[i][j],max(getarea(p[i],p[j],p[k]),max(dp[i][k],dp[k][j]))); 边界条件dp[i][i+1] = 0,其余初始化inf 如果出现上面的情况ABD,就不能组成三角形,中间包含点C。我们判断S...

FlyingJack 222

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

例题9-11 最大面积的最小的三角剖分 UVa1331

1.题目描述:点击打开链接 2.解题思路:本题属于“最优三角剖分”型的dp,设d(i,j)表示子多边形i,i+1,...,j-1(i d(i,j)=min(S(i,j,k),max(d(i,k),d(k,j))|i 其中,S(i,j,k)为三角形i-j-k的面积。不过此时需要保证i-j是对角线(唯一的例外是i=0且j=n-1),具体做法是当边i-j不满足条件时直接设为INF,其他部分和凸多边

Skyline 1593

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

UVA 1331 Minimax Triangulation 区间DP

区间DP: 将一个多边形三角剖分,让可以得到的最大三角形的面积最小 dp[i][j]表示从i点到j点的最优值,枚举中间点k dp[i][j]=min(dp[i][j],max(area(i,j,k),max(dp[i][k],dp[k][j]))); 注意如果中间三角形i-j-k中有其他的点,这样的三角形是不可以剖分的 Minimax Triangu

码代码的猿猿 1536

uva 1331

原题: Triangulation of surfaces has applications in the Finite Element Method of solid mechanics. The objective is to estimate the stress and strain on complex objects by partitioning them into small si...

@fei 405

【UVA1331】关于最优三角剖分

最优三角剖分的一类题目都是差不多的。给你一个多边形,让你把它分割成若干个三角形,求三角形某最优解,比如UVA1331要求面积最大的三角形的面积最小。如图是各种切割方法:            不知道一开始看到最大值最小化会不会又一下子想到枚举答案二分去了呢,不过本题正解是DP。          然而,这题最难的地方不是推出递推方程,而是表示状态。因为如果允许随意切割

剑锋OI SharpSwordOI 741
上一篇: uva 1626 Brackets sequence(区间dp)
下一篇: Codeforces Round #484 (Div. 2) C. Cut 'em all!(思维)
ffgcc
博客等级 码龄9年 32粉丝 296原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值