UVA1543 圆和多边形 Telescope 题解
_Jocularly_ · · 题解
首先把多边形划分成同起点的多个三角形,那么我们显然可以动态规划,令
首先可以发现,给出的实数代表与周长的比值,可以转化为与
需要分别枚举起点
#include<bits/stdc++.h>
using namespace std;
const double pi = acos(-1);
int n,m;
double p[45];
double dp[45][45][45];
double ans;
pair<double,double> trans(int i){//把第i个点转化为坐标形式
double a = 2 * pi * p[i];
return {cos(a),sin(a)};
}
double dis(double x1,double y1,double x2,double y2){//计算欧几里得距离
return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
double cal(int a,int b,int c){//海伦公式计算由三个点构成的三角形的面积
pair<double,double> A = trans(a);
pair<double,double> B = trans(b);
pair<double,double> C = trans(c);
double AB = dis(A.first,A.second,B.first,B.second);
double BC = dis(B.first,B.second,C.first,C.second);
double AC = dis(A.first,A.second,C.first,C.second);
double p = (AB + BC + AC) / 2;
return sqrt(p * (p - AB) * (p - BC) * (p - AC));
}
int main(){
while(cin >> n >> m && (n || m)){
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
cin >> p[i];
}
for(int i=1;i<=n-m+1;i++){
for(int j=i+1;j<=n;j++){
for(int k=2;k<m;k++){
for(int p=j+1;p<=n;p++){
dp[i][p][k + 1] = max(dp[i][p][k + 1],dp[i][j][k] + cal(i,j,p));
}
}
}
}
ans = 0;
for(int i=1;i<=n-m+1;i++){
for(int j=i+1;j<=n;j++){
ans = max(ans,dp[i][j][m]);
}
}
cout << fixed << setprecision(6) << ans << "\n";
}
return 0;
}