凸多边形剖分
题目:
给定一具有N个顶点(从1到N编号)的凸多边形,有多种方法可以对它进行三角形剖分。即用N-3条不相交的对角线把这个凸多边形划分成N-2个三角形。现在请你找到一种剖分方案,使得分出的N-2个三角形的周长之和最大。
1 #include<cmath> 2 #include<queue> 3 #include<cstdio> 4 #include<cstring> 5 #include<iostream> 6 #include<algorithm> 7 using namespace std; 8 int N; 9 struct Point{ 10 double x,y; 11 }E[805]; 12 void Init(){ 13 scanf("%d",&N); 14 for(int i=1;i<=N;i++) 15 scanf("%lf%lf",&E[i].x,&E[i].y); 16 return ; 17 } 18 double L(int i,int j){ 19 return sqrt((E[i].x-E[j].x)*(E[i].x-E[j].x)+(E[i].y-E[j].y)*(E[i].y-E[j].y)); 20 } 21 double Dist[805][805]; 22 double Dp(int i,int j){ 23 if(Dist[i][j]) return Dist[i][j]; 24 if(i+3==j) return max(L(i,i+2),L(i+1,j)); 25 double t1=0.0; 26 t1=max(t1,Dp(i+1,j)+L(i+1,j)); 27 t1=max(t1,Dp(i,j-1)+L(i,j-1)); 28 return Dist[i][j]=t1; 29 } 30 void Solve(){ 31 double ans=L(1,N); 32 for(int i=1;i<N;i++) 33 ans+=L(i,i+1); 34 printf("%.2f\n",Dp(1,N)*2+ans); 35 return ; 36 } 37 int main(){ 38 Init(); 39 Solve(); 40 return 0; 41 }