Cod sursa(job #1750671)

Utilizator Athena99Anghel Anca Athena99 Data 30 august 2016 18:50:37
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <algorithm>
#include <fstream>

using namespace std;

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

const int inf= 1<<30;
const int nmax= 200;

struct str {
    int x, y;
};

int d1[nmax+1][nmax+1], d2[nmax+1][nmax+1], x[nmax+1][nmax+1];
str v[nmax+1];

int d( int i, int j ) {
    return -v[i].x+v[i].y+v[j].x+v[j].y;
}

bool cmp( str x, str y ) {
    return x.x<y.x;
}

void f( int i, int j ) {
    if ( x[i][j]==0 ) {
        x[i][j]= 1;
        for ( int k= i; k<=j; ++k ) {
            f(i, k-1);
            f(k+1, j);
            d1[i][j]= min(d1[i][j], d(i-1, k)+max(d1[k+1][j], d2[i][k-1]));
            d2[i][j]= min(d2[i][j], d(k, j+1)+max(d1[k+1][j], d2[i][k-1]));
        }
    }
}

int main(  ) {
    int n;
    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 ) {
        for ( int j= i; j<=n; ++j ) {
            d1[i][j]= d2[i][j]= inf;
        }
    }
    f(1, n);

    int sol= inf;
    for ( int i= 1; i<=n; ++i ) {
        sol= min(sol, max(v[i].x, -v[i].x)+v[i].y+max(d1[i+1][n], d2[1][i-1]));
    }

    fout<<sol<<"\n";

    return 0;
}