动态规划---例题5.凸多边形最优三角剖分问题
动态规划---例题5.凸多边形最优三角剖分问题
一.题目描述
通常,用多边形顶点的序列来表示一个凸多边形,即P=
若vi与vj是多边形上不相邻的两个顶点,则线段vivj称为多边形的一条弦。弦将多边形分割成凸的两个子多边形
如上图为一个凸多边形的两个不同的三角剖分.n在凸多边形P的一个三角剖分T中,各弦互不相交且弦数已达到最大,即P的任一不在T中的弦必与T中某一弦相交。
有n个顶点的凸多边形的三角剖分中,恰好有n-3条弦和n-2个三角形。
凸多边形最优三角剖分的问题是:给定一个凸多边形P=
可以定义三角形上各种各样的权函数W。例如:定义 ω(△vivjvk) = |vivj| + |vivk| + |vkvj|,其中,|vivj|是点vi到vj的欧氏距离。相应于此权函数的最优三角剖分即为最小弦长三角剖分。
注意:解决此问题的算法必须适用于任意的权函数。
二.解题思路
这是计算几何学问题,但在本质上与矩阵连乘积的最优计算次序问题极为相似。可用动态规划算法。
1. 三角剖分的结构及其相关问题
凸多边形的三角剖分与表达式的完全加括号方式之间具有十分紧密的联系。正如矩阵连乘积的最优计算次序问题等价于矩阵链的完全加括号方式.这些问题之间的相关性可从它们所对应的完全二叉树的同构性看出。所谓完全二叉树是指叶结点以外的所有结点的度数都为2的二叉树。
一个表达式的完全加括号方式对应于一棵完全二叉树,这棵二叉树叫作表达式的语法树。
例:与完全加括号的矩阵连乘积((A1(A2A3))(A4(A5A6)))对应的语法树如图(a)。
叶结点:表达式中一个原子。在语法树中,表达式(ELEr)对应一棵子树,其左子树表示表达式EL,其右子树表示表达式ER。有n个原子的完全加括号表达式与一棵有n个叶结点的语法树一一对应。
凸多边形
除v0v6以外的边是叶结点。树根v0v6是三角形v0v3v6的一条边,该三角形将原多边形分为3个部分:一个三角形,两个凸多边形.
三角形v0v3v6的另外两条边,即弦v3v6和v0v3为根的两个儿子。以它们为根的子树分别表示凸多边形
一个凸n边形的三角剖分与n-1个叶子的语法树一一对应。由于n个矩阵的完全加括号乘积与n个叶子的语法树之间存在一一对应关系,因此n个矩阵的完全加括号乘积也与凸(n+1)边形的三角剖分之间存在一一对应关系。上图中(a)和(b)表示出了这种对应关系,这时n=6。矩阵连乘积A1A2..A6中的每个矩阵Ai对应于凸(n+1)边形中的一条边vi-1vi。三角剖分中的一条弦vivj,i n矩阵连乘积的最优计算次序问题是凸多边形最优三角剖分问题的一个特殊情形。 对于给定的矩阵链A1A2..An,定义与之相应的凸(n+1)边形P= 凸多边形的最优三角剖分问题有最优子结构性质。 若凸(n+1)边形P= 定义t[i,j],1≤i 由最优子结构性质,t[i,j]的值应为t[i,k]的值加上t[k+1,j]的值,再加上△vi-1vkvj的权值,并在i≤k≤j-1的范围内取最小。由此,t[i,j]可递归地定义为: 上式与矩阵连乘积的最优计算次序问题中计算m[i,j]的公式(P40)几乎完全一样(除了权函数的定义外),因此,对计算m[i,j]的算法Matrix_Chain略做修改就可用于计算t[i,j]。 计算凸(n+1)边形P= 对于任意的1≤i≤j≤n ,上述算法在计算每一个子多边形 因此,利用最优子结构性质并借助于s[i,j],1≤i≤j≤n ,凸(n+l)边形P= 代码如下: 运行结果: 本篇文章参考我的老师毕方明《算法设计与分析》课件.
依此权函数的定义,凸多边形P的最优三角剖分所对应的语法树给出矩阵链A1A2..An的最优完全加括号方式。2.最优子结构性质
3.最优三角剖分的递归结构
设退化的多边形
t[i,j]的值可以利用最优子结构性质递归地计算。由于退化的2顶点多边形的权值为0,所以t[i,i]=0,i=1,2,…,n 。当j-i≥1时,子多边形
4.计算最优值
5.构造最优三角剖分
// 凸多边形最优三角剖分
// 与矩阵连乘一样的思路。矩阵连乘的最优计算次序问题是凸多边形最优三角剖分问题的特殊情形
#include
欢迎大家访问我的个人博客 --- 乔治的编程小屋,和我一起为大厂offer努力吧!