Mai intai trebuie sa te autentifici.
Cod sursa(job #171640)
Utilizator | Data | 4 aprilie 2008 18:27:34 | |
---|---|---|---|
Problema | Wanted | Scor | 10 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.32 kb |
#include <cstdio>
#include <algorithm>
#define maxN 201
#define inf 0x3f3f3f3f
using namespace std;
int N;
int L[maxN][maxN], R[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)
{
L[i][i] = R[i][i] = 0;
if(i < N) L[i][i+1] = R[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;
L[i][j] = Dist(i, j) + R[i+1][j];
R[i][j] = Dist(i, j) + L[i][j-1];
for(k=i+1; k<j; ++k)
{
int dl = Dist(i, k);
int dr = Dist(j, k);
L[i][j] = Min(L[i][j], dl+Max(R[i][k-1], L[k][j]));
R[i][j] = Min(R[i][j], dr+Max(R[i][k], L[k+1][j]));
}
}
}
int ret = inf;
for(i=1; i<=N; ++i)
ret = Min(ret, Dist(0, i)+Max(L[i][N], R[1][i]));
printf("%d", ret);
fclose(stdin);
fclose(stdout);
return 0;
}