题目链接1433吃奶酪
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
int n;
double ans=2147483647.0;
double dis[16][16];
struct point
{
double x;
double y;
}a[17];
double dp[17][17];//当前点的编号,此时加上这个点总共有几个点,存储的是最短的距离
void Initdis()
{
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
if(i==j)continue;
dis[i][j]=sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));
}
}
}
void Print()
{
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
cout<<dis[i][j]<<" ";
}
cout<<endl;
}
}
double Min(double xx,double yy)
{
if(xx>yy)return yy;
return xx;
}
int main()
{
memset(dp,127,sizeof(dp));
cin>>n;
a[0].x=0.0;
a[0].y=0.0;
for(int i=1;i<=n;i++)
{
cin>>a[i].x>>a[i].y;
}
Initdis();
//Print();
for(int i=1;i<=n;i++)
dp[i][2]=dis[i][0];//从(0,0)出发
for(int i=1;i<=n;i++)//当前点编号
{
for(int j=1;j<=n;j++)//上一个点
{
if(i==j)continue;
for(int k=3;k<=n+1;k++)//当前共有几个点
{
dp[i][k]=Min(dp[j][k-1]+dis[i][j],dp[i][k]);
}
}
}
for(int i=1;i<=n;i++)
ans=Min(ans,dp[i][n+1]);
printf("%0.2lf",ans);
return 0;
}