zoukankan      html  css  js  c++  java
  • 最优三角剖分

    同样是紫书上的题。

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

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

  • 相关阅读:
    kill命令
    linux grep命令
    ps命令详解
    Linux chmod命令详解
    Linux netstat命令详解
    多线程同步机制的几种方法
    C++_运算符重载 总结
    malloc/free与new/delete的区别
    python发送邮件
    linux之nfs
  • 原文地址:https://www.cnblogs.com/yohanlong/p/7726119.html
Copyright © 2011-2022 走看看