#include <bits/stdc++.h>//:给一个带权值的凸多边形,将其三角剖分,就是分割成若干个互不相交的三角形的弦集合,求各个三角形上权之和的最小值
using namespace std;//凸多边形就是任意两个点之间的连线一定在多边形内部或边界
/*6
0 2 3 1 5 6
2 0 3 4 8 6
3 3 0 10 13 7
1 4 10 0 12 5
5 8 13 12 0 3
5 6 7 5 3 0
*/
const int M=1005;
int n,s[M][M];
double f[M][M],g[M][M];
void fun(){
for(int i=1;i<=n;i++){
f[i][i]=0;s[i][i]=0;
}
for(int d=2;d<=n;d++){
for(int i=1;i<=n-d+1;i++){
int j=i+d-1;
f[i][j]=f[i+1][j]+g[i-1][i]+g[i][j]+g[i-1][j];
s[i][j]=i;
for(int k=i+1;k<j;k++){
double t=f[i][k]+f[k+1][j]+g[i-1][k]+g[k][j]+g[i-1][j];
if(f[i][j]>t){
f[i][j]=t;s[i][j]=k;
}
}
}
}
}
void print(int i,int j){
if(i==j)return ;
if(s[i][j]>i)cout<<"{v"<<i-1<<"v"<<s[i][j]<<"}"<<'\n';
if(j>s[i][j]+1)cout<<"{v"<<s[i][j]<<"v"<<j<<"}"<<'\n';
print(i,s[i][j]);
print(s[i][j]+1,j);
}
int main(){
cin>>n;n--;
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
cin>>g[i][j];
fun();
cout<<f[1][n]<<'\n';
print(1,n);
return 0;
}
凸多边形的最优三角剖分问题
最新推荐文章于 2024-04-01 15:35:29 发布