Pagini recente » Cod sursa (job #676936) | Cod sursa (job #2217744) | Cod sursa (job #299151) | Cod sursa (job #3213569) | Cod sursa (job #171627)
Cod sursa(job #171627)
#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;
}