Cod sursa(job #2147346)

Utilizator Y0da1NUME JMECHER Y0da1 Data 28 februarie 2018 17:53:12
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string.h>

using namespace std;

int N;
const int oo = 2e9;
pair <int, int> A [205];

inline int modul(int x)
{
    return (x > 0 ? x : -x);
}

int64_t d[2][205][205];
int64_t dinamica(int st, int dr, int start)
{
    int dir = (st > start); //dc st > start trebe sa mergem sprea dreapta (1), dc nu spre stanga (0)
    if(st > dr)
        return 0;
    //nu repetam subcazuri deja facute
    if(d[dir][st][dr] != -1)
        return d[dir][st][dr];
    d[dir][st][dr] = oo;
    for(int i = st; i <= dr; ++i)
    {
        int64_t temp = max(dinamica(st, i - 1, i), dinamica(i + 1, dr, i));
        temp += A[start].second + A[i].second + modul(A[start].first - A[i].first);

        d[dir][st][dr] = min (d[dir][st][dr], temp);
    }
    return d[dir][st][dr];
}
int main()
{
    ifstream in ("wanted.in");
    ofstream out ("wanted.out");

    in>>N;
    for (int i = 1; i <= N; ++i)
        in>>A[i].first>>A[i].second;
    sort(A + 1, A + N + 1);

    memset(d, -1, sizeof (d));
    out<<dinamica(1, N, 0);
    return 0;
}