Cod sursa(job #3163631)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 31 octombrie 2023 18:34:44
Problema Wanted Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <bits/stdc++.h>

using namespace std;

const long long max_size = 2e2 + 6, INF = 1e18 + 1;

long long dpl[max_size][max_size], dpr[max_size][max_size];
pair <long long, long long> pct[max_size];

long long dist (long long x, long long y)
{
    return abs(pct[x].first - pct[y].first) + abs(pct[x].second + pct[y].second);
}

signed main ()
{
#ifdef LOCAL
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#else
    freopen("wanted.in", "r", stdin);
    freopen("wanted.out", "w", stdout);
#endif // LOCAL
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    long long n;
    cin >> n;
    for (long long i = 1; i <= n; i++)
    {
        cin >> pct[i].first >> pct[i].second;
    }
    sort(pct + 1, pct + n + 1);
    for (long long i = 1; i <= n; i++)
    {
        if (i > 1)
        {
            dpl[i][i] = dist(i - 1, i);
        }
        if (i < n)
        {
            dpr[i][i] = dist(i, i + 1);
        }
    }
    for (long long d = 2; d < n; d++)
    {
        for (long long i = 1; i + d - 1 <= n; i++)
        {
            long long j = i + d - 1;
            dpl[i][j] = INF;
            dpr[i][j] = INF;
            for (long long k = i; k <= j; k++)
            {
                if (i > 1)
                {
                    dpl[i][j] = min(dpl[i][j], dist(i - 1, k) + max(dpr[i][k - 1], dpl[k + 1][j]));
                }
                if (j < n)
                {
                    dpr[i][j] = min(dpr[i][j], dist(j + 1, k) + max(dpr[i][k - 1], dpl[k + 1][j]));
                }
            }
        }
    }
    long long ans = INF;
    for (long long i = 1; i <= n; i++)
    {
        ans = min(ans, dist(0, i) + max(dpr[1][i - 1], dpl[i + 1][n]));
    }
    cout << ans;
    return 0;
}