最优三角剖分

同样是紫书上的题。

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

那么做法是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

 

posted @ 2017-10-24 22:03  yohanlong  阅读(205)  评论(0编辑  收藏  举报