Cod sursa(job #2215734)

Utilizator lucametehauDart Monkey lucametehau Data 23 iunie 2018 13:29:30
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream>
#include <algorithm>
#include <cmath>
#define x first
#define y second

using namespace std;

ifstream cin ("wanted.in");
ofstream cout ("wanted.out");

typedef pair <int, int> Point;
const int NMAX = 201;
const int INF = 2000000000;

int n;

Point v[1 + NMAX];
int dp[2][1 + NMAX][1 + NMAX];

int dist(Point a, Point b) {
  return abs(b.x - a.x) + a.y + b.y;
}

int main() {
  cin >> n;
  for(int i = 1; i <= n; i++)
    cin >> v[i].x >> v[i].y;
  sort(v + 1, v + n + 1);
  for(int i = 2; i <= n; i++)
    dp[0][i][i] = dist(v[i - 1], v[i]);
  for(int i = 1; i < n; i++)
    dp[1][i][i] = dist(v[i], v[i + 1]);
  // dp[0][i][j] = distanta min pt a verifica intervalul (i, j) daca pornesc din satul i - 1
  // dp[1][i][j] = distanta min pt a verifica intervalul (i, j) daca pornesc din satul j + 1
  for(int d = 2; d < n; d++) {
    for(int i = 1; i <= n; i++) {
      int j = i + d - 1;
      dp[0][i][j] = dp[1][i][j] = INF;
      for(int k = i; k <= j; k++) {
        if(i > 1)
          dp[0][i][j] = min(dp[0][i][j], dist(v[i - 1], v[k]) + max(dp[0][k + 1][j], dp[1][i][k - 1]));
        if(j < n)
          dp[1][i][j] = min(dp[1][i][j], dist(v[k], v[j + 1]) + max(dp[0][k + 1][j], dp[1][i][k - 1]));
      }
    }
  }
  int sol = INF;
  for(int i = 1; i <= n; i++)
    sol = min(sol, dist(make_pair(0, 0), v[i]) + max(dp[0][i + 1][n], dp[1][1][i - 1]));
  cout << sol;
  return 0;
}