Cod sursa(job #2913640)

Utilizator vlad2009Vlad Tutunaru vlad2009 Data 15 iulie 2022 18:20:35
Problema Wanted Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <fstream>
#include <algorithm>
#include <cmath>
#define int long long

using namespace std;

const int MAX_N = 2 * 1e2;
const int INF = (1LL << 50);
int dp1[MAX_N + 1][MAX_N + 1], dp2[MAX_N + 1][MAX_N + 1];
int n;

struct point {
    int x;
    int y;
};

bool operator < (const point &a, const point &b) {
    return a.x < b.x || (a.x == b.x && a.y < b.y);
}

point a[MAX_N + 1];

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

signed main() {
    ifstream fin("wanted.in");
    ofstream fout("wanted.out");
    fin >> n;
    for (int i = 1; i <= n; i++) {
        fin >> a[i].x >> a[i].y;
    }
    sort(a + 1, a + n + 1);
    for (int i = 1; i <= n; i++) {
        for (int j = i; j <= n; j++) {
            dp1[i][j] = INF;
            dp2[i][j] = INF;
        }
    }
    for (int i = 2; i <= n; i++) {
        dp1[i][i] = dist(a[i - 1], a[i]);
    }
    for (int i = 1; i <= n - 1; i++) {
        dp2[i][i] = dist(a[i], a[i + 1]);
    }
    for (int h = 2; h <= n; h++) {
        for (int i = 1; i + h - 1 <= n; i++) {
            int j = i + h - 1;
            for (int k = i; k <= j; k++) {
                if (i > 1) {
                    dp1[i][j] = min(dp1[i][j], dist(a[i - 1], a[k]) + max(dp1[k + 1][j], dp2[i][k - 1]));
                }
                if (j < n) {
                    dp2[i][j] = min(dp2[i][j], dist(a[k], a[j + 1]) + max(dp1[k + 1][j], dp2[i][k - 1]));
                }
            }
        }
    }
    int answer = INF;
    for (int i = 1; i <= n; i++) {
        int aux = dist(point {0, 0}, a[i]) + max(dp1[i + 1][n], dp2[1][i - 1]);
        answer = min(answer, aux);
    }
    fout << answer;
    return 0;
}