fork(2) download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. #define mp make_pair
  5. #define f first
  6. #define s second
  7. ll dp[1002][1002],dist[1002][1002];
  8. ll recurse(int i,int n,int frontLast,int revLast,int end)
  9. {
  10. if(i==n-1)
  11. {
  12. return dist[frontLast][end]+dist[revLast][end];
  13. }
  14. if(dp[frontLast][revLast]!=-1)
  15. return dp[frontLast][revLast];
  16. ll temp=min(dist[frontLast][i]+recurse(i+1,n,i,revLast,end),dist[revLast][i]+recurse(i+1,n,frontLast,i,end));
  17. dp[frontLast][revLast]=temp;
  18. return temp;
  19. }
  20. int main() {
  21. int n;
  22. cin>>n;
  23. vector<pair<ll,ll> >v;
  24. memset(dp,-1,sizeof(dp));
  25. for(int i=0;i<n;i++)
  26. {
  27. ll x,y;
  28. cin>>x>>y;
  29. x*=1000;y*=1000;
  30. v.push_back(mp(x,y));
  31. }
  32. sort(v.begin(),v.end());
  33. if(n==1)
  34. {
  35. int w=1/0;
  36. }
  37. for(int i=0;i<n;i++)
  38. {
  39. for(int j=i+1;j<n;j++)
  40. {
  41. ll temp1=v[i].f-v[j].f,temp2=v[i].s-v[j].s;
  42. dist[i][j]=sqrt(pow(temp1,2)+pow(temp2,2));
  43. dist[j][i]=dist[i][j];
  44. }
  45. }
  46. ll ansTemp=recurse(1,n,0,0,n-1);
  47. double ans=(double)ansTemp/1000.0;
  48. printf("%.2lf\n",ans);
  49. return 0;
  50. }
Success #stdin #stdout 0.01s 11540KB
stdin
100
32 51
19 49
40 70
39 99
37 86
89 90
2 29
88 86
10 56
51 15
11 93
90 1
28 90
31 80
44 81
2 3
31 13
44 22
73 33
36 78
27 33
16 27
60 35
29 3
57 41
32 18
81 26
85 23
93 25
58 31
39 32
54 54
57 59
65 78
32 30
46 44
53 97
90 95
29 97
14 45
0 80
29 23
39 84
54 70
71 84
57 37
81 35
45 46
2 51
2 49
92 80
61 38
0 78
88 86
1 90
71 31
27 13
31 72
4 84
82 37
49 7
76 12
25 86
2 57
51 30
70 98
97 55
4 0
47 29
19 23
76 42
12 29
52 90
89 97
31 61
64 59
29 96
0 44
88 76
79 82
8 67
77 62
41 8
56 16
70 94
39 0
52 48
22 35
72 88
15 32
53 81
27 13
37 61
89 53
2 7
72 19
54 14
58 18
92 29
18 9
stdout
1616.60