Cod sursa(job #161427)

Utilizator astronomyAirinei Adrian astronomy Data 18 martie 2008 01:04:51
Problema Wanted Scor Ascuns
Compilator cpp Status done
Runda Marime 1.57 kb
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <algorithm>
#include <map>
using namespace std;

#define MAXN 205
#define PII pair<int, int>
#define x first
#define y second

int N, best[MAXN][MAXN][2]; PII A[MAXN]; map<int, int> T;

int ABS(int x) { return x < 0 ? -x : x; }

int baga(int i, int j, int t)
{
    if(i > j) return 0;
    if(best[i][j][t] != -1) return best[i][j][t];
    
    if(i == j)
    {
        if(t == 0) best[i][j][t] = ABS(A[i-1].x-A[i].x)+A[i-1].y+A[i].y;
        if(t == 1) best[i][j][t] = ABS(A[i+1].x-A[i].x)+A[i+1].y+A[i].y;
        return best[i][j][t];
    }


    int ret = 1<<30, k;
    for(k = i; k <= j; k++)
    {
        int aux;
        if(t == 0) aux = ABS(A[i-1].x-A[k].x)+A[i-1].y+A[k].y;
        if(t == 1) aux = ABS(A[j+1].x-A[k].x)+A[j+1].y+A[k].y;
        aux += max( baga(i, k-1, 1), baga(k+1, j, 0) );
        ret = min(ret, aux);
    }

    return best[i][j][t] = ret;
}

int main(void)
{
    freopen("wanted.in", "rt", stdin);
    freopen("wanted.out", "wt", stdout);

    int i;

    assert(scanf("%d\n", &N)==1);  assert(N >= 1 && N <= 200);

    for(i = 1; i <= N; i++)
    {
        assert(scanf("%d %d\n", &A[i].x, &A[i].y)==2);
        assert(A[i].x >= -10000 && A[i].x <= 10000);
        assert(A[i].y >= 0 && A[i].y <= 10000);
        assert(T[ A[i].x ] == 0);
        T[A[i].x] = 1;
    }
        
    A[0].x = A[0].y = 0;

    sort(A+1, A+N+1);
    
    memset(best, -1, sizeof(best));
    printf("%d\n", baga(1, N, 0));

    return 0;
}