给定一个具有N(N<50)个顶点(从1到N编号)的凸多边形,每个顶点的权均已知。问如何把这个凸多边形划分成N-2个互不相交的三角形,使得这些三角形顶点的权的乘积之和最小?
输入文件:第一行 顶点数N
第二行 N个顶点(从1到N)的权值
输出格式:最小的和的值
各三角形组成的方式
输入示例:5
122 123 245 231
输出示例:The minimum is :12214884
/* 区间DP f[i][j]表示区间i-j的最小成绩之和,然后枚举断点k,使i,j,k形成一个三角形。 */ #include<iostream> #include<cstdio> #include<cstring> #define N 60 #define lon long long using namespace std; int a[N],n; lon f[N][N]; int main(){ memset(f,127/3,sizeof(f)); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) f[i][i+1]=0; for(int i=n-2;i>=1;i--) for(int j=i+2;j<=n;j++) for(int k=i+1;k<j;k++) f[i][j]=min(f[i][j],f[i][k]+f[k][j]+a[i]*a[j]*a[k]); cout<<f[1][n]; return 0; }