首页 > 其他 > 详细

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

时间:2020-05-13 22:43:49      阅读:57      评论:0      收藏:0      [点我收藏+]

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

技术分享图片

给定一具有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\n", f[1][n]);
23     return 0;
24 }

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

原文:https://www.cnblogs.com/hzoi-poozhai/p/12885091.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!