Cod sursa(job #490390)

Utilizator DraStiKDragos Oprica DraStiK Data 6 octombrie 2010 14:52:26
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <algorithm>
using namespace std;

#define INF 0x3f3f3f3f
#define sc second
#define fs first
#define DIM 205
#define DOWN 0
#define UP 1

pair <int,int> v[DIM];
int bst[2][DIM][DIM];
int n,sol;

void read ()
{
    int i;

    scanf ("%d",&n);
    for (i=1; i<=n; ++i)
        scanf ("%d%d",&v[i].fs,&v[i].sc);
}

void solve ()
{
    int i,j,k,lg;

    sort (v+1,v+n+1);
    v[0].fs=-INF; v[n+1].sc=INF;
    for (lg=1; lg<=n; ++lg)
        for (i=1; i+lg-1<=n; ++i)
        {
            j=i+lg-1;
            bst[DOWN][i][j]=bst[UP][i][j]=INF;
            for (k=i; k<=j; ++k)
            {
                bst[DOWN][i][j]=min (bst[DOWN][i][j],max (bst[UP][i][k-1],bst[DOWN][k+1][j])+v[i-1].sc+v[k].fs-v[i-1].fs+v[k].sc);
                bst[UP][i][j]=min (bst[UP][i][j],max (bst[UP][i][k-1],bst[DOWN][k+1][j])+v[j+1].sc+v[j+1].fs-v[k].fs+v[k].sc);
            }
        }
    sol=INF;
    for (i=1; i<=n; ++i)
        sol=min (sol,max (bst[UP][1][i-1],bst[DOWN][i+1][n])+v[i].sc+abs (v[i].fs));
    printf ("%d",sol);
}

int main ()
{
    freopen ("wanted.in","r",stdin);
    freopen ("wanted.out","w",stdout);

    read ();
    solve ();

    return 0;
}