Pagini recente » Cod sursa (job #671353) | asem-info | Cod sursa (job #2783886) | Cod sursa (job #685969) | Cod sursa (job #171614)
Cod sursa(job #171614)
#include <cstdio>
#include <algorithm>
#define maxN 201
#define inf 0x3f3f3f3f
using namespace std;
int N;
int Left[maxN][maxN], Right[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)
{
Left[i][i] = Right[i][i] = 0;
if(i < N) Left[i][i+1] = Right[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;
Left[i][j] = Dist(i, j) + Right[i][j-1];
Right[i][j] = Dist(i, j) + Left[i+1][j];
for(k=i+1; k<j; ++k)
{
int dl = Dist(i, k);
int dr = Dist(k, j);
Left[i][j] = Min(Left[i][j], dl+Max(Left[i+1][k], Right[k][j]));
Right[i][j] = Min(Right[i][j], dr+Max(Left[i][k], Right[k][j-1]));
}
}
}
int ret = inf;
for(i=1; i<=N; ++i)
ret = Min(ret, Dist(0, i)+Max(Left[1][i], Right[i][N]));
printf("%d", ret);
fclose(stdin);
fclose(stdout);
return 0;
}