danielvitor23

Cortes

Oct 25th, 2020
523
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.70 KB | None | 0 0
  1. /*
  2.     Author: [UFC-QXD] Daniel Vitor Pereira Rodrigues <[email protected]>
  3. */
  4. #include <bits/stdc++.h>
  5. using namespace std;
  6.  
  7. typedef long long i64;
  8. typedef pair<int, int> ii;
  9. typedef pair<i64, i64> ll;
  10. typedef vector<int> vi;
  11. typedef vector<i64> vi64;
  12. typedef vector<ii> vii;
  13. typedef vector<ll> vll;
  14. typedef vector<vi> vvi;
  15.  
  16. const double eps = 1e-9;
  17.  
  18. #define eq(a, b) (abs(a - b) < eps)
  19. #define lt(a, b) ((a + eps) < b)
  20. #define gt(a, b) (a > (b + eps))
  21. #define le(a, b) (a < (b + eps))
  22. #define ge(a, b) ((a + eps) > b)
  23.  
  24. struct pt { double x, y; };
  25.  
  26. double dist(const pt& a, const pt& b) {
  27.     return hypot(a.x-b.x, a.y-b.y);
  28. }
  29.  
  30. int seen[500][500], timer;
  31. double dp[500][500];
  32.  
  33. pt pts[500];
  34.  
  35. int n;
  36. double solve(int i, int j) {
  37.     if (j <= i + 2) return 0.0;
  38.     if (seen[i][j] == timer) return dp[i][j];
  39.     seen[i][j] = timer;
  40.     double ans = 1e12;
  41.     ans = min(ans, solve(i + 1, j - 1) + (i+2<j)*dist(pts[i + 1], pts[j - 1]));
  42.     ans = min(ans, solve(i, j - 2) + (i+2<j)*dist(pts[i], pts[j - 2]));
  43.     ans = min(ans, solve(i + 2, j) + (i+2<j)*dist(pts[i + 2], pts[j]));
  44.     if (i+3<j) {
  45.         ans = min(ans, solve(i, j - 3) + dist(pts[j], pts[j-3]));
  46.         ans = min(ans, solve(i + 3, j) + dist(pts[i], pts[i+3]));
  47.     }
  48.     return dp[i][j] = ans;
  49. }
  50.  
  51. double ans;
  52.  
  53. int main() {
  54.     ios_base::sync_with_stdio(0), cin.tie(0);
  55.    
  56.     cin >> n;
  57.     n <<= 1;
  58.  
  59.     for (int i = 0; i < n; ++i) {
  60.         cin >> pts[i].x >> pts[i].y;
  61.         pts[i+n] = pts[i];
  62.     }
  63.  
  64.     ans = 1e12;
  65.  
  66.     for (int i = 0; i < n; ++i) {
  67.         for (int j = i + 3; j < n; ++j) {
  68.             ++timer;
  69.             ans = min(ans, dist(pts[i], pts[j]) +
  70.                            solve(i, j) + solve(j, i+n));
  71.         }
  72.     }
  73.  
  74.     cout << fixed << setprecision(4);
  75.     cout << ans << '\n';
  76.  
  77.     return 0;
  78. }
  79.  
Advertisement
Add Comment
Please, Sign In to add comment