凸多边形最优三角形剖分

问题描述

当一个简单的多边形及其内部构成一个闭凸集时,则称该简单多边形为一个凸多边形。即凸多边形边界上或内部任意两点所连成的直线上所有的点都在多边形内部或边界上。通常用顶点的逆时针序列来表示凸多边形,即P={V0,V1,V2…Vn-1},表示有n条边的凸多边形,如图我们约定V0=Vn:

在这里插入图片描述

凸多边形最优三角剖分问题:给定凸多边形P={V0,V1,V2…Vn-1},以及定义在由凸多边形的边和弦组成的三角形上的权函数w,要求确定该凸多边形的三角剖分,使得该三角剖分所对应的权,即三角剖分中诸三角形上权之和为最小。
在这里插入图片描述

分析最优子结构

多边形的最优三角剖分问题有最优子结构性质。事实上,若凸n+1 边形P={V0, V1, …Vn}的最优三角剖分T包含三角形V0VkVn (1≤k≤n-I),则T的权为三角形V0VkVn的权、子多边形{V0, V1, … Vk}和{Vk, Vk+1, … Vn}的权之和。可以断言,由T确定的这两个子多边形的三角剖分也是最优的。因为若有{V0, V1, … Vk}或{Vk, Vk+1,… Vn}的更小权的三角剖分,将导致T不是最优三角剖分的矛盾。
这个结构和矩阵连乘问题一致:矩阵连乘

在这里插入图片描述

最优三角剖分的递归结构

首先我们定义t[i][j](1<=i<j<=n)为凸k-i+2边形P={Vi-1,Vi,…Vj}三角剖分最优权值。为了方便处理,我们预处理Vi-1Vi=0,也就是说t[i][i]=0,由这个定义我们可以发现我们整个凸多边形的最优权值为t[1][n],在从P={Vi-1,Vi,.....Vj}中选取一个顶点k作为剖分(i<=k<=j-1),一共有j-i种取法,我们要从当中选取最优的一种剖分:
在这里插入图片描述
所以递推关系式可以描述如下:
在这里插入图片描述

动态规划实现

const int maxn=105;//顶点个数
int t[maxn][maxn];
void dpTriangle(int n,int t[][maxn],int s[][maxn])
{
    for(int i=0;i<n;i++) t[i][i]=0;//预处理
    for(int r=2;r<=n;r++)//r条边
    {
        for(int i=1;i<=n-r+1;i++)
        {
            int j=i+r-1;
            t[i][j]=t[i+1][j]+w(i-1,i,j);
            s[i][j]=i;//初始化为第一个值
            for(int k=i+1;k<j;k++)//在[i+1,i+r-1)区间内选择一个k点
            {
                int u=t[i][k]+t[k+1][j]+w(i-1,k,j);
                if(u<t[i][j])
                {
                    t[i][j]=u;
                    s[i][j]=k;
                }
            }
        }
    }
}

时间复杂度O(n^3)
空间复杂度O(n^2)

原创文章 236 获赞 430 访问量 7万+

猜你喜欢

转载自blog.csdn.net/weixin_44307065/article/details/105498550