出处不详 凸多边形最优三角剖分

news/2024/10/27 13:19:58/

目录

  • 出处不详 凸多边形最优三角剖分
    • 题目描述
      • 背景
      • 输入
      • 输出
      • 数据范围
    • 题解

出处不详 凸多边形最优三角剖分

题目描述

背景

给定 n n n边凸多边形,要求确定该凸多边形的三角剖分(将多边形分割成 n − 2 n - 2 n2个三角形),使得该三角剖分中诸三角形的权值和最小(三角形的权值等于三条边权值相加)

输入

  1. 第一行一个整数 n n n,表示凸多边形的边数;
  2. 接下来 n n n行,其中第 i i i行输入 n − i + 1 n - i + 1 ni+1个数,第 j j j个数表示顶点 i i i到顶点 i + j − 1 i + j - 1 i+j1的边或弦的权值

输出

一个整数,表示最小权值和

数据范围

3 ≤ n ≤ 8 3 \le n \le 8 3n8

题解

假设弦 ( i , j ) (i , j) (i,j)必须连接(不妨令 i < j i < j i<j),考虑它与它某一侧围成的多边形(不妨取顶点编号在 i , j i , j i,j之间的那一侧),设为 A i , j A_{i , j} Ai,j,在 A i , j A_{i , j} Ai,j中,弦 ( i , j ) (i , j) (i,j)一定参与且仅参与构成了一个三角形,因为已知三角形的两个顶点 i , j i , j i,j,所以枚举这个三角形时只需要枚举剩下的那个顶点,设为 k k k i < k < j i < k < j i<k<j
定义二维数组 f , v a l f,val f,val f [ i ] [ j ] f[i][j] f[i][j]表示 A i , j A_{i , j} Ai,j的最优三角剖分权值和, v a l [ i ] [ j ] val[i][j] val[i][j]表示边或弦 ( i , j ) (i , j) (i,j)的权值( i < j i < j i<j),则状态转移方程为 f [ i ] [ j ] = min ⁡ ( f [ i ] [ j ] , f [ i ] [ k ] + f [ k ] [ j ] + v a l [ i ] [ k ] + v a l [ k ] [ j ] + v a l [ i ] [ j ] ) f[i][j] = \min(f[i][j] , f[i][k] + f[k][j] + val[i][k] + val[k][j] + val[i][j]) f[i][j]=min(f[i][j],f[i][k]+f[k][j]+val[i][k]+val[k][j]+val[i][j])
考虑一开始弦 ( i , j ) (i , j) (i,j)的极端情况,即边 ( i , j ) (i , j) (i,j),这样最后的答案就变成了 f [ 1 ] [ n ] f[1][n] f[1][n]
代码如下:

#include<cstdio>
#include<cstring>#define il inlineconst int M = 1e2 + 5;il int read() {int x = 0;char c = getchar();while(c < '0' || c > '9') c = getchar();while(c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();return x;
}int n, val[M][M], f[M][M];il int getL(int a, int b, int c) {     //求三个顶点所围三角形的权值return val[a][b] + val[b][c] + val[a][c];
}int main() {n = read();memset(f, 0x7f, sizeof(f));for(int i = 1; i <= n; ++i) {for(int j = i; j <= n; ++j)val[i][j] = read();f[i][i + 1] = 0;     //防止更新时出错}for(int i = n - 2; i > 0; --i) {     //因为前面的要用后面的,所以i从后往前枚举for(int j = i + 2; j <= n; ++j)     //A_{i , j}至少要是一个三角形for(int k = i + 1; k < j; ++k) {int tmp = f[i][k] + f[k][j] + getL(i, k, j);if(tmp < f[i][j]) f[i][j] = tmp;}}printf("%d", f[1][n]);return 0;
}

http://www.ppmy.cn/news/1542350.html

相关文章

C++ | Leetcode C++题解之第503题下一个更大元素II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {int n nums.size();vector<int> ret(n, -1);stack<int> stk;for (int i 0; i < n * 2 - 1; i) {while (!stk.empty() &am…

秋叶启动器下,如何升级ComfyUI的pytorch版本到2.5

最近测试mochi在comfyui里的表现效果&#xff0c;发现这个相关的节点总是装不上。后来到节点官方看了下作者说明&#xff0c;要求torch版本至少2.5以上。 而comfyui最近官方刚更新了torch的支持版本。如下&#xff1a; 如果是自己手工部署过的&#xff0c;那就正常部署和升级t…

GaussDB逻辑解码技术原理

1.前言 随着国内各大行业数字化改造步伐的加快&#xff0c;异构数据库数据同步的需求场景越来越多。 异构数据库同步&#xff0c;就是将不同类型、不同结构的数据库之间的数据进行同步处理&#xff0c;以确保数据在不同数据库之间的一致性。比如&#xff0c;将当前数据库的数…

PMP--必刷题–解题–111-120

文章目录 9.资源管理--3.获取资源--首选分析111、 [单选] 一位项目经理管理着一个矩阵组织中的多个信息技术(IT)项目。该项目经理安排了一次会议&#xff0c;与其中一个职能经理协调两个软件开发项目的测试支持。不幸的是&#xff0c;职能经理无法参加会议&#xff0c;并告知项…

前端处理返回的number类型超出16位的问题 ,在axios中统一处理

前端处理返回的number类型超出16位的问题 &#xff0c;在axios中统一处理 造成原因&#xff1a;js的number类型有个最大安全值&#xff0c;即2的53次方&#xff08;9007199254740992&#xff09;&#xff0c;超过这个值就会出现精度丢失的问题。 后端处理&#xff1a;将数字类…

第10讲:函数递归

目录 **1. 递归是什么&#xff1f;**2. 递归举例3. 递归与迭代 1. 什么是递归 2. 递归的限制条件 3. 递归的举例 4. 递归与迭代 正文开始 1. 递归是什么&#xff1f; 递归是学习C语言函数绕不开的⼀个话题&#xff0c;那什么是递归呢&#xff1f; 递归其实是⼀种解决问题的方…

口腔疾病图文多模态知识图谱展示问答系统

毕业设计是不是总感觉找不到方向&#xff1f;别慌&#xff01;今天给大家推荐一个超级贴合现代技术创新的项目&#xff1a;口腔疾病图文多模态知识图谱展示问答系统&#xff0c;简直是为你量身定制的科技大礼包&#xff01; 项目亮点一&#xff1a;知识图谱展示 要研究口腔疾…

神经架构搜索:自动化设计神经网络的方法

在人工智能&#xff08;AI&#xff09;和深度学习&#xff08;Deep Learning&#xff09;快速发展的背景下&#xff0c;神经网络架构的设计已成为一个日益复杂而关键的任务。传统上&#xff0c;研究人员和工程师需要通过经验和反复试验来手动设计神经网络&#xff0c;耗费大量时…