//poj 2677
//sep9
#include <iostream>
#include <cmath>
using namespace std;
const int maxN=128;
struct P
{
double x,y;
}p[maxN];
int n;
double dp[maxN][maxN],dis[maxN][maxN];
double solve()
{
dp[1][2]=dis[1][2];
for(int j=3;j<=n;++j){
for(int i=1;i<=j-2;++i)
dp[i][j]=dp[i][j-1]+dis[j-1][j];
dp[j-1][j]=9999999.9;
for(int k=1;k<=j-2;++k)
dp[j-1][j]=min(dp[j-1][j],dp[k][j-1]+dis[k][j]);
}
return dp[n-1][n]+dis[n-1][n];
}
int main()
{
while(scanf("%d",&n)==1){
for(int i=1;i<=n;++i)
scanf("%lf%lf",&p[i].x,&p[i].y);
for(int i=1;i<=n;++i)
for(int j=1;j<i;++j){
double dx=p[i].x-p[j].x;
double dy=p[i].y-p[j].y;
dis[j][i]=sqrt(dx*dx+dy*dy);
}
double ans=solve();
printf("%.2lf\n",ans);
}
return 0;
}
poj 2677 dp解双调tsp
最新推荐文章于 2020-04-24 20:06:48 发布