给定一具有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 }
原文:https://www.cnblogs.com/hzoi-poozhai/p/12885091.html