Cod sursa(job #2828264)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 7 ianuarie 2022 00:34:26
Problema Wanted Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin("wanted.in");
ofstream fout("wanted.out");

const int inf = (1 << 30);
int n, ans;
int dl[205][205], dr[205][205];

struct oras {
    int x, y;
}v[205];

bool cmp(oras a, oras b)
{
    return a.x < b.x;
}

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

int main()
{
    fin >> n;
    for(int i = 1; i <= n; i++)
        fin >> v[i].x >> v[i].y;
    sort(v + 1, v + n + 1, cmp);
    for(int i = 1; i <= n; i++)
    {
        if(i != 1)
            dl[i][i] = dist(i, i - 1);
        if(i != n)
            dr[i][i] = dist(i, i + 1);
    }
    for(int d = 1; d <= n - 2; d++)
    {
        for(int i = 1; i <= n; i++)
        {
            int j = i + d;
            dl[i][j] = inf, dr[i][j] = inf;
            for(int k = i; k <= j; k++)
            {
                if(i > 1)
                    dl[i][j] = min(dl[i][j], dist(i - 1, k) + max(dl[k + 1][j], dr[i][k - 1]));
                if(j < n)
                    dr[i][j] = min(dr[i][j], dist(k, j + 1) + max(dl[k + 1][j], dr[i][k - 1]));
            }
        }
    }
    ans = inf;
    for(int i = 1; i <= n; i++)
        ans = min(ans, dist(0, i) + max(dl[i + 1][n], dr[1][i - 1]));
    fout << ans;
    return 0;
}