SLOJ P2067. 三角剖分问题
AcWing1069.凸多边形的划分(区间DP)
题目描述
给定由N顶点组成的凸多边形 每个顶点具有权值 将凸N边形剖分成N-2个三角形 求N-2个三角形顶点权值乘积之和最小?
输入格式
2行,第一行一个整数n表示3<n<100个顶点 接下来n个数w[i]表示每个顶点的权值0<w[i]<=100
输出格式
剖分成n-2个三角最小的权值乘积之和
样例
输入数据 1
5 1 2 3 4 5
输出数据 1
38
好吧,其实是从SLOJ(sszx的垃圾玩意)上面复制下来的
思路:
设dp[i][j]表示i到j这一段连续的n边形划分成两部分后最小乘积
暴力枚举i到j之间顶点k
转移方程:dp[i][j] = min(dp[i][j],(dp[i][k]+dp[k][j]+a[i]*a[j]*a[k]))
#include<bits/stdc++.h> using namespace std; int n; long long a[210],dp[210][210]; int main(){ memset(dp,0x3f,sizeof(dp)); scanf("%d",&n); for(int i = 1;i<=n;i++) scanf("%lld",&a[i]); for(int i = n;i>=1;i--){ for(int j = i+1;j<=n;j++){ if(j-i==1) dp[i][j] = 0; else if(j-i==2){ dp[i][j] = a[i]*a[i+1]*a[i+2]; }else{ for(int k = i+1;k<=j-1;k++) dp[i][j] = min(dp[i][j],dp[i][k]+dp[k][j]+a[i]*a[j]*a[k]); } } } printf("%lld",dp[1][n]); return 0; }
综上所述,我是蒟蒻
2022-10-27 21:57:04
标签:210,int,凸多边形,DP,AcWing1069,顶点,dp From: https://www.cnblogs.com/cztq/p/16829711.html