Cod sursa(job #165954)

Utilizator filipbFilip Cristian Buruiana filipb Data 27 martie 2008 10:38:57
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define minim(a, b) ((a < b) ? a : b)
#define maxim(a, b) ((a > b) ? a : b)
#define INF 1000000001
#define PII pair<int, int>
#define x first
#define y second

int N, D[205][205], bst;
PII v[205];

int modul(int X)
{ return (X < 0 ? -X : X); }

int main(void)
{
    int i, j, d, k;
    
    freopen("wanted.in", "r", stdin);
    freopen("wanted.out", "w", stdout);

    scanf("%d", &N);
    for (i = 1; i <= N; ++i)
        scanf("%d %d", &v[i].x, &v[i].y);

    sort(v+1, v+N+1);
    for (d = 2; d <= N; ++d)
    {
        for (i = 1; i <= N-d+1; ++i)
        {
            j = i+d-1;

            D[i][j] = INF;
            for (k = i+1; k <= j; ++k)
                D[i][j] = minim(D[i][j], maxim(D[k][i+1], D[k][j]) + v[k].x-v[i].x+v[k].y+v[i].y);
            D[j][i] = INF;
            for (k = i; k < j; ++k)
                D[j][i] = minim(D[j][i], maxim(D[k][j-1], D[k][i]) + v[j].x-v[k].x+v[k].y+v[j].y);
        }
    }

    bst = INF;
    for (i = 1; i <= N; ++i)
        bst = minim(bst, maxim(D[i][1], D[i][N]) + modul(v[i].x) + v[i].y);

    printf("%d\n", bst);

    return 0;
}