凸多边形的三角剖分【区间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\n", f[1][n]);
23     return 0;
24 }
posted @ 2020-05-13 21:42  poozhai  阅读(393)  评论(0编辑  收藏  举报