题⽬描述 按顺时针给出一个凸多边形,任意两点间有一条直线边,求经过每个点恰好一次的最长不自交(和之前线段相交)路径
输⼊格式
第一行一个整数n,表示n个点。 接下来n
行,每行两个整数x,y,表示点的坐标
输出格式
输出最长不自交(和之前线段相交)路径长度,保留5位小数
样例数据
输入1
4
0 0
0 1
1 1
1 0
输出1
3.41421
数据规模与约定
对于100%的数据,1≤n≤2000,1≤x,y≤1000000000
求调
#include<bits/stdc++.h>
using namespace std;
int n;
double f[5][2005],g[5][2005];
struct node{
int x,y;
}a[2005];
double Pow(double x){
return x*x;
}
double dis(node a,node b){
return sqrt(Pow(a.x-b.x)+Pow(a.y-b.y));
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d",&a[i].x,&a[i].y);
}
for(int j=1;j<n;j++){
for(int i=0;i<n;i++){
f[j%2][i]=max(f[(j-1)%2][(i+1)%n]+dis(a[i],a[(i+1)%n]),
g[(j-1)%2][(i+j)%n]+dis(a[i],a[(i+j)%n]));
g[j%2][i]=max(g[(j-1)%2][(i-1+n)%n]+dis(a[i],a[(i-1+n)%n]),
f[(j-1)%2][(i-j+n)%n]+dis(a[i],a[(i-j+n)%n]));
}
}
double ans=0;
for(int i=0;i<n;i++){
ans=max(ans,max(f[(n-1)%2][i],g[(n-1)%2][i]));
}
printf("%.5f",ans);
return 0;
}
第一次放代码,轻喷QWQ