Cod sursa(job #171627)

Utilizator raula_sanChis Raoul raula_san Data 4 aprilie 2008 18:06:28
Problema Wanted Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
#include <algorithm>

#define maxN 201
#define inf 0x3f3f3f3f

using namespace std;

int N;
int R[maxN][maxN], L[maxN][maxN];

pair <int, int> V[maxN];

int Min(int i, int j)
{
	return
		i < j ? i : j;
}

int Max(int i, int j)
{
    return
        i > j ? i : j;
}

int Mod(int i)
{
	return
		i < 0 ? -i : i;
}

int Dist(int i, int j)
{
	return
		Mod(V[i].first-V[j].first) + Mod(V[i].second) + Mod(V[j].second);
}

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

	int i, x, y;
	for(scanf("%d", &N), i=1; i<=N; ++i)
	{
		scanf("%d %d", &x, &y);

		V[i].first = x;
		V[i].second = y;
	}
	sort(V+1, V+N+1);

    for(i=1; i<=N; ++i)
    {
        R[i][i] = L[i][i] = 0;

        if(i < N) R[i][i+1] = L[i][i+1] = Dist(i, i+1);
    }

	int l, j, k;
	for(l=3; l<=N; ++l)
	{
		for(i=1; i<=N-l+1; ++i)
		{
			j = i + l - 1;
			
			R[i][j] = Dist(i, j) + L[i][j-1];
            L[i][j] = Dist(i, j) + R[i+1][j];
			
			for(k=i+1; k<j; ++k)
			{
				int dl = Dist(i, k);
				int dr = Dist(k, j);
			
				R[i][j] = Min(R[i][j], dr+Max(R[i+1][k], L[k][j]));
				L[i][j] = Min(L[i][j], dl+Max(R[i][k], L[k][j-1]));
			}
		}
	}

    int ret = inf;
    for(i=1; i<=N; ++i)
        ret = Min(ret, Mod(V[i].first)+Mod(V[i].second)+Max(R[1][i], L[i][N]));

    printf("%d", ret);

	fclose(stdin);
	fclose(stdout);
	
	return 0;
}