傳送門:http://www.cqoi.net:2012/problem.php?id=1508
題目描述:
輸入:
輸出:
樣例輸入:
0 6
1 0
2 3
5 4
6 1
7 5
8 2
樣例輸出:
分析:
code:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 1000
#define LL long long
#define INF 1e18
using namespace std;
inline double min(double a,double b){return a<b?a:b;}
pair<LL,LL>node[MAXN+5];
int n;
double getdis(int i,int j){return sqrt((node[i].first-node[j].first)*(node[i].first-node[j].first)+(node[i].second-node[j].second)*(node[i].second-node[j].second));}
double f[MAXN+5][MAXN+5],ans=INF;
void dp()
{
int i,j;
for(i=3;i<=n;i++)
for(j=1;j<i;j++)
{
if(j==i-1)
for(int k=1;k<i-1;k++)
f[i][j]=min(f[i][j],f[i-1][k]+getdis(i,k));
else
f[i][j]=min(f[i][j],f[i-1][j]+getdis(i-1,i));
}
}
int main()
{
int i;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%I64d%I64d",&node[i].first,&node[i].second);
sort(node+1,node+n+1);
memset(f,0x42,sizeof f);
f[1][1]=0;
f[2][1]=getdis(1,2);
dp();
for(i=1;i<n;i++)
ans=min(ans,f[n][i]+getdis(n,i));
printf("%.2lf\n",ans);
}