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