凸多边形三角划分

给定一个具有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;
}
原文地址:https://www.cnblogs.com/harden/p/6730880.html