zoukankan      html  css  js  c++  java
  • 凸多边形的三角剖分【区间dp】

    凸多边形的三角剖分【区间dp】

    img

    给定一具有N个顶点(从1到N编号)的凸多边形,每个顶点的权均已知。问如何把这个凸多边形划分成N-2个互不相交的三角形,使得这些三角形顶点的权的乘积之和最小?

    样例输入

    5
    121 122 123 245 231
    

    样例输出

    12214884
    

    思路

    这道题有一个有趣的性质,如果剖分出的多边形是最优的,那么他的子多边形的剖分也必须是最优的

    枚举起点 i,终点 j, 三角形顶点 k (i < k < j)
    设dp[i][j]表示多边形 vi ······· vj 的最优剖分, a[i]为点 i 的权值
    动态转移方程 dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]+a[i]*a[k]*a[j])

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     5 #define int long long
     6 const int maxn = 55, inf = 0x3f3f3f3f;
     7 using namespace std;
     8 int n, k, f[maxn][maxn], a[maxn];
    10 signed main(){
    11     scanf("%lld", &n);
    12     for(int i=1; i<=n; i++) scanf("%lld", &a[i]);
    13     memset(f, 0x3f, sizeof(f));
    14     for(int i=1; i<=n; i++) f[i][i] = f[i][i+1] = 0;//不能构成多边形
    15     for(int j=2; j<=n; j++){
    16         for(int i=j-2; i>0; i--){
    17             for(int k=i+1; k<j; k++){
    18                 f[i][j] = min(f[i][j], f[i][k]+f[k][j]+a[i]*a[k]*a[j]);
    19             }
    20         }
    21     }
    22     printf("%lld
    ", f[1][n]);
    23     return 0;
    24 }
    
  • 相关阅读:
    每日日报2020.9.30 1905
    每日日报2020.10.7 1905
    每日日报2020.10.2 1905
    每日日报2020.9.28 1905
    程序员修炼之道:从小工到专家 九月读书心得 1905
    每日日报2020.9.27 1905
    每日日报2020.9.29 1905
    每日日报2020.10.6 1905
    每日日报2020.10.5 1905
    每日总结2
  • 原文地址:https://www.cnblogs.com/hzoi-poozhai/p/12885091.html
Copyright © 2011-2022 走看看