最优三角剖分

Posted yohanlong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最优三角剖分相关的知识,希望对你有一定的参考价值。

同样是紫书上的题。

紫书上并没有给出每一个三角形所贡献的的权值的计算方法,我这里就擅作主张,定义成点权的乘积和好了。

那么做法是DP,这里注意设状态的方式(我这么设是为了使需要求解的问题区间变得连续)。

记Vi 为第i个顶点。

设Ti, j 为Vi-1到Vj的最小积和。

Ti, j = min{Ti, k + Tk + 1, j + ai -1 * aj * ak} k ∈ [i, j)

最后注意处理i == j || i - 1 == j的情况, 全部赋成0即可。

答案 = T2, n

#include <cstdio>

using namespace std;

const int maxn = 105, inf = 1e9;

int n; 

int a[maxn], t[maxn][maxn], vis[maxn][maxn], c[maxn][maxn];

int f(int x, int y)
{
    if (vis[x][y]) return c[x][y];
    vis[x][y] = 1;
    int& ans = c[x][y];//记忆化搜索
    if (x == y || x - 1 == y) return ans = 0;
    ans = inf;
    for (int k = x; k < y; k++)
    {
        int t1 = f(x, k), t2 = f(k + 1, y), t3 = a[x - 1] * a[y] * a[k];
        int t = t1 + t2 + t3;
        if (t < ans) ans = t;
    }
    return ans;
}

int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
    } 
    a[0] = a[n];
    printf("%d", f(2, n));
    return 0;
}

//

4

1 2 3 4

输出:

18

 

以上是关于最优三角剖分的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 【动态规划】凸多边形最优三角剖分【3.5】

ZOJ 3537 Cake (凸包 + 区间DP && 最优三角形剖分)

凸多边形最优三角剖分

UVa 1331 最大面积最小的三角剖分

1039. 多边形三角剖分的最低得分

算法设计与分析——凸多边形最优三角剖分