凸多边形最优三角划分(动态规划)

原理

  1. 问题定义及目标
    凸多边形最优三角剖分问题旨在给定一个凸多边形,通过添加若干条不相交的对角线将其分割成多个三角形,使得所有三角形的权值之和最小。这里的权值通常与三角形的顶点相关,可以是边长、角度或者其他自定义的度量值,在代码中通过权函数 W(vi, vj, vk) 来计算以顶点 vivjvk 构成的三角形的权值。

  2. 动态规划思想及状态定义

    • 状态定义
      使用二维数组 m[i][j] 表示从顶点 i 到顶点 j 所构成的子多边形(包含这两个顶点以及它们之间按顺序的顶点)进行最优三角剖分后的最小权值和。例如,m[2][5] 表示由顶点 2345 构成的子多边形的最优三角剖分的权值和。同时,使用二维数组 s[i][j] 用于记录在 m[i][j] 的最优剖分中,选择的划分顶点(即与 i 和 j 构成三角形的那个中间顶点),以便后续构造出具体的最优三角剖分方案。
    • 状态转移方程及思想依据
      对于边界情况,当 i = j 时,即子多边形只包含一个顶点,不存在三角剖分,所以 m[i][i] = 0。对于一般情况(i < j),考虑从顶点 i 到顶点 j 的子多边形的最优三角剖分,其可以通过选择一个中间顶点 ki < k < j),将子多边形划分为两个子多边形(一个是从 i 到 k,另一个是从 k + 1 到 j),再加上以 ikj 构成的三角形(其权值通过 W(i - 1, k, j) 计算),然后取所有可能的中间顶点 k 划分方式下的最小值作为 m[i][j] 的值,状态转移方程可以表示为:

      通过从较小规模的子多边形(即较小的 j - i 值)逐步计算到整个多边形(i = 1j = n),最终得到整个凸多边形的最优三角剖分的最小权值和存储在 m[1][n] 中,同时 s[1][n] 记录了对应的最优划分顶点信息。

步骤

  1. 初始化动态规划数组(外层第一个 for 循环部分)
    通过循环 for(int i = 1; i <= n; i++) m[i][i] = 0; 对 m 数组进行初始化,将 m 数组中对角线元素(即 i = j 时)都设置为 0,因为单个顶点构成的子多边形不存在三角剖分,权值和自然为 0,这是边界情况的初始化。

  2. 动态规划计算最优三角剖分权值和及记录划分顶点(外层第二个 for 循环部分,包含多层嵌套循环)

    • 外层循环通过 for(r = 2; r <= n; r++) 控制子多边形的规模(这里用 r 表示子多边形包含的顶点个数,从 2 个顶点开始逐步增加到整个多边形的 n&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值