动态规划DP——凸多边形最优三角剖分

article/2025/9/18 12:08:28

1.问题分析

 我们可以把披萨饼看作是一个凸多边形,凸多边形是指多边形的任意两点的连线均落在多边形的内部或边界上。

(1)什么是凸多边形?

如下图所示,是一个凸多边形

如下图所示,不是一个凸多边,因为v1v3连线落在了多边形的外部

凸多边形不相邻的两个顶点的连线称为凸多边形的弦

(2)什么是凸多边形的三角剖分?

凸多边形的三角剖分是指将一个凸多边形分割成互不相交的三角形的弦的集合。如下图所示,都是三角形的剖分,三角形的剖分有很多种:

如果我们在给定凸多边形及定义在边,弦上的权值,即任意两点之间定义一个数值作为i权值,如图所示:

三角形上权值之和是指三角形的3条边上的权值之和:

w(vi vk vj)=|vi vk| + |vk vj | + |vi vj| 

如图所示,w(v0v1v4)=|v0v1| + |v1v4| + |v0v4| = 22+8+5=15.

(3)什么是凸多边形最优三角剖分?

一个凸多边形的三角剖分有很多种,最优三角剖分就是划分的各三角形上权函数之和最小的三角剖分。

2.算法设计

 凸多边形最优三角剖分满足动态规划的最优子结构性质,可以从自底向上逐渐推出整体的最优。

(1)确定合适的数据结构

采用二维数组g[ ][ ]记录各个顶点之间的连接权值,二维数组m[ ][ ]存放各个子问题的最优值,二维数组s[ ][ ]存放各个子问题的最优策略。

(2)初始化

输入顶点数n,然后依次输入各个顶点之间的连接权值存储在二维数组g[ ][ ]中,令n=n-1(顶点标号从v0开始),

m[i][i]=0,s[i][i]=0,其中i=1,2,3,4……,n-1。

(3)循环

  • 按照递归关系式计算3个顶点{v i-1,vi,vi+1}的最优三角剖分,j=i+1,将最优值存入m[i][j],同时将最优策略存入s[i][j],i=1,2,3,……,n-1。
  • 按照递归关系式计算4个顶点{v i-1,vi,vi+1,vi+2}的最优三角剖分,j=i+2,将最优值存入m[i][j],同时将最优策略存入s[i][j],i=1,2,3,……,n-2。
  • 以此类推,直到求出所有顶点{v0,v1,v2,……,vn}的最优三角剖分,并将最优值存入m[1][n],将最优策略记入s[1][n]

(4)构造最优解

根据最优决策信息数组s[ ][ ]递归构造最优解,即输出凸多边形的最优剖分的所有弦。s[1][n],表示凸多边形最优三角剖分位置。

  • 如果子问题1为空,即没有一个顶点,说明V0Vs[1][n]是一条边,不是弦,不需要输出,否则,输出该弦V0Vs[1][n]
  • 如果子问题2为空,即没有一个顶点,说明Vs[1][n]Vn是一条边,不是弦,不需要输出,否则,输出该弦Vs[1][n]Vn
  • 递归构造两个子问题{ v0,v1,v2,……,Vs[1][n] } 和 { Vs[1][n] ,v1,v2,……,vn },一直递归到子问题为空停止。

3.源代码

 

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <sstream>
#include <algorithm>
using namespace std;const int M =1111;
int n; //顶点数
int s[M][M];//记录最优策略二维数组
double m[M][M];//记录最优值二维数组
double g[M][M];//记录各顶点之间权值的二维数组void convex_Polygon_Triangulation()
{for (int i=1;i<=n;i++) //初始化{m[i][i]=0;s[i][i]=0;}for(int d=2;d<=n;d++)//d为问题规模,d=2实际上有三个点{for (int i=1;i<=n-d+1;i++)//控制i值{int j=i+d-1; //j值m[i][j]=m[i+1][j]+g[i-1][i]+g[i][j]+g[i-1][j];//策略为k=i的情况s[i][j]=i;for (int k=i+1;k<j;k++) //枚举划分点i到j所有情况{double temp=m[i][k]+m[k+1][j]+g[i-1][k]+g[k][j]+g[i-1][j];if(m[i][j]>temp){m[i][j]=temp;s[i][j]=k;}}}}
}void print (int i,int j)  //递归求解所有子问题的弦。
{if(i==j)return ;if(s[i][j]>i){cout << "{v" << i-1 << "v" << s[i][j] << "}" << endl;}if(s[i][j]+1<j){cout << "{v" << s[i][j] << "v" << j << "}" << endl;}print(i,s[i][j]);print(s[i][j]+1,j);
}int main()
{int i;int j;cout << "请输入顶点个数n:"<< endl;cin >> n;n--;cout << "请依次输入各顶点的连接权值:" << endl;for (i=0;i<=n;++i){for (j=0;j<=n;++j){cin >> g[i][j];}}convex_Polygon_Triangulation();cout << "最优三角剖分的权值和是:" << endl;cout << m[1][n]<< endl;cout << "顶点的集合是:"<< endl;print(1,n);return 0;
}

 

4.测试结果

 


http://chatgpt.dhexx.cn/article/EAK73KQ1.shtml

相关文章

凸多边形、凹多边形、凸包算法

凸多边形&#xff1a; &#xff08;Convex Polygon&#xff09;可以有以下三种定义&#xff1a; 1、没有任何一个内角是优角&#xff08;Reflexive Angle&#xff09;的多边形。 2、如果把一个多边形的所有边中&#xff0c;有一条边向两方无限延长成为一直线时&#xff0c;其他…

搜狗浏览器屏蔽广告插件_“云法庭”里“云勘验” 法院开审搜狗浏览器插件屏蔽优酷视频广告案...

在第20个世界知识产权日到来之际&#xff0c;北京海淀法院通过“北京法院云法庭”公开开庭审理原告优酷信息技术(北京)有限公司(下称优酷公司)与被告北京搜狗科技发展有限公司、被告北京搜狗信息服务有限公司(下合称搜狗公司)涉搜狗浏览器插件屏蔽优酷视频广告不正当竞争纠纷案…

搜狗浏览器屏蔽广告插件_“云法庭”里“云勘验”,海淀法院开庭审理搜狗浏览器插件屏蔽优酷视频广告不正当竞争纠纷案...

来源&#xff1a; 北京海淀法院 特别提示&#xff1a;凡本号注明“来源”或“转自”的作品均转载自媒体&#xff0c;版权归原作者及原出处所有。所分享内容为作者个人观点&#xff0c;仅供读者学习参考&#xff0c;不代表本号观点。 在第20个世界知识产权日到来之际&#xff0…

搜狗浏览器屏蔽广告插件_“云法庭”里“云勘验”法院开审搜狗浏览器插件屏蔽优酷视频广告案...

在第20个世界知识产权日到来之际&#xff0c;北京海淀法院通过“北京法院云法庭”公开开庭审理原告优酷信息技术(北京)有限公司(下称优酷公司)与被告北京搜狗科技发展有限公司、被告北京搜狗信息服务有限公司(下合称搜狗公司)涉搜狗浏览器插件屏蔽优酷视频广告不正当竞争纠纷案…

【视频广告位叫法】

例如&#xff1a;爱奇艺&#xff0c;优酷&#xff0c;腾讯视频&#xff0c;前贴&#xff0c;中插&#xff0c;暂停贴&#xff0c;后贴广告位&#xff01;

优酷 DSP 广告投放系统架构实践

作者 | 鸿雁 阿里文娱技术专家 导读&#xff1a;随着 RTB 网络在线展现广告交易模式的兴起&#xff0c;各大公司都纷纷搭建自己的 DSP ( Demand-Side Platform ) 广告投放系统进行获客。优酷在近几年也搭建 DSP 系统&#xff0c;并且在持续迭代。在这一过程中&#xff0c;经历…

优酷视频在网站里播放

工具/原料 准备一组代码&#xff1a; <embed srchttp://static.youku.com/v1.0.0149/v/swf/loader.swf?VideoIDS视频ID&winTypeadshow&isAutoPlaytrue quality"high" width"580" height"435" align"middle" allowScriptA…

网页引用优酷视频并添加封面自动播放

引用优酷视频可以减轻公司的服务器压力&#xff0c;而且和自己上传保存视频相比会方便轻松许多&#xff0c;不过相对的需要忍受广告。 首先你需要在优酷里找到你要引用的视频&#xff0c;或者自己上传。然后打开会有一个分享按钮&#xff1a; 以我使用的第二个为例&#xff0…

html上传优酷视频,如何将视频发布到自己的企业网站上?

郑州做网站是为了更好的宣传企业&#xff0c;如果网站要想有视频的表现形式&#xff0c;那就得花点心思去考虑了。一般情况下&#xff0c;要想把视频放到网站上&#xff0c;无外乎就两种方式&#xff1a;第一、直接把视频上传到网站目录&#xff0c;然后在合适的位置调用。由于…

php视频系统源码,基于ThinkPHP框架仿优酷视频源码带数据,后台功能强大

源码介绍 最新高仿优酷视频网源码带数据&#xff0c;后台功能齐全强大&#xff0c;而且是基于thinkphph内核开发&#xff0c;很不错&#xff0c;虽然是旧版模板&#xff0c;但是也值得学习&#xff0c;尤其是正在学习ThinkPHP框架的人拿来学习&#xff0c;相信你需要&#xff0…

鸿蒙os去广告,隐藏福利?华为鸿蒙OS新惊喜:优酷视频流转播放可免广告

近日&#xff0c;华为鸿蒙OS 2.0开发者公测版推送正式开启&#xff0c;包括华为Mate X2、Mate 40系列等机型均可先行尝鲜。 根据目前已知信息来看&#xff0c;华为手机从6月初开始将可升级鸿蒙系统。 随着参与开发者公测的用户逐渐增多&#xff0c;网上出现大量鸿蒙OS的测试体验…

优酷视频整段代理php,thinkphp仿优酷带数据源码|php仿优酷视频源码带后台功能强大...

本项目是仿优酷官网&#xff0c;优酷官网是一个集多种知识面为一体的网站&#xff0c;能全面的锻炼我们的技能,所以我们决定仿优酷网。 本项目后台主要实现了&#xff1a;用户管理、分类管理、视频管理、评论管理、权限管理、轮播管理、网站配置和广告管理以及登录退出等模块。…

android加载优酷视频播放器,使用android优酷视频云一些问题

最近项目迭代需要添加视频播放功能&#xff0c;由于若干原因就选择了优酷视频&#xff0c;本来挺简单的一个功能在做的时候居然碰到了若干意想不到的问题&#xff0c;果然还是优酷视频提供的demo最稳定啊&#xff0c;啥问题木有~~o(>_ 好了&#xff0c;闲话不多说&#xff0…

html调用优酷视频播放,优酷网视频播放器站外调用详解

优酷网视频播放器站外调用详解 蓝叶 网站设计 2011-03-21 14201 5评论 自从蓝叶准备做视频盒&#xff0c;就一直在研究各个视频站播放器调用代码&#xff0c;只要搞明白了 代码我都共享出来了&#xff0c;这次说说优酷网播放器的站外调用方法。优酷网默认获取的 站…

mac os x 设置终端快捷键

大家都知道在linux下可以用ctraltt组合快捷来打开终端&#xff0c;那么在OS X上可以吗&#xff1f;答案是肯定的&#xff0c;其实OS X上很多功能都可以通过Apple自家的Automator.app创建&#xff0c;且使用此方法可以为任何程序创建快捷键。 废话少说&#xff0c;下面给大家演…

Mac - 当前位置打开终端

1、点击屏幕顶部的“Finder”弹出下拉菜单。 2、点击“服务”菜单项弹出子菜单&#xff0c;点击子菜单中的“服务偏好设置” 3、点击弹出的服务偏好设置窗口中的“服务”并勾选“新建位于文件夹位置的终端窗口”&#xff1b;点击该项还可以为该操作设置快捷键。 4、关闭设置窗口…

Mac自己创建打开终端快捷键(任意软件)

这里就以为“终端”程序设置一个快捷启动键。 1、打开自带的Automator&#xff08;可以用右上角Spotlight搜索找到&#xff09; 2、在创建界面选择“服务” 3、如图&#xff1a;左侧列表中&#xff0c;找到&#xff1a;操作——资源库——实用工具——开启应用程序 右侧…

Xcode终端快捷键

Xcode 直接打开终端 Xcode作为开发编辑器&#xff0c;居然不能直接打开终端&#xff0c;所以就没有快捷键&#xff0c;但是可以借助自定义 Behavior 来执行脚本&#xff0c;这样就有快捷键了&#xff0c;比如我的CMD Shift T。 1. 准备打开终端的脚本 首先编辑 shell 脚本…

MAC 终端快捷键实用

首先需要打开终端&#xff0c;这个基本都会用的吧。 在Dock里面打开Launchpad&#xff08;也可快捷键F3&#xff09;&#xff0c;找到终端的图标&#xff0c;点击打开就OK了。 现在准备工作已经做完&#xff0c;我们就来进行实地操作吧。 commandN&#xff1a;打开多个终端窗口…

mac 打开多个终端快捷键

使用快捷键&#xff1a;comman t 即可创建多个