Pagini recente » Cod sursa (job #493332) | Cod sursa (job #1719754) | Cod sursa (job #3259216) | Cod sursa (job #2569711) | Cod sursa (job #1228101)
#include<cstdio>
#include<algorithm>
using namespace std;
int ans, n, dp[209][209][2], x[209], y[209], p[209];
int mod (int x)
{
if ( x < 0 ) return -x;
return x;
}
int dist (int p1, int p2)
{
if ( x[p1] == x[p2] ) return mod (y[p1] - y[p2]);
return mod(y[p1]) + mod(y[p2]) + mod ( x[p1] - x[p2] );
}
bool cmp (int p1, int p2)
{
return ( y[p1] < y[p2] );
}
int main()
{
freopen ("wanted.in", "r", stdin);
freopen ("wanted.out", "w", stdout);
scanf ("%d", &n);
for (int i=1; i<=n; i++)
scanf ("%d %d", &x[i], &y[i]), p[i] = i;
sort (p+1, p+n+1, cmp);
for (int i = n; i >= 1; i--)
for (int j = i; j <= n; j++)
dp[i][j][0] = dp[i][j][1] = 1<<28;
for (int i = n; i >= 1; i--)
for (int j = i; j <= n; j++)
{
if ( i==j )
{
dp[i][j][0] = dp[i][j][1] = 0;
continue;
}
if ( j==i+1)
{
dp[i][j][0] = dp[i][j][1] = dist (i, j);
continue;
}
for (int k=i+1; k<=j; k++)
dp[i][j][0] = min ( dp[i][j][0], max (dp[i+1][k][1], dp[k][j][0] ) + dist ( p[i], p[k] ) );
for (int k=i; k<j; k++)
dp[i][j][1] = min ( dp[i][j][1], max (dp[i][k][1], dp[k][j-1][0] ) + dist ( p[j], p[k] ) );
}
ans = 1<<28;
for (int i=1; i<=n; i++)
ans = min(ans, max(dp[1][p[i]][0], dp[p[i]][n][1]) + mod(x[p[i]]) + mod(y[p[i]]) );
printf ("%d\n", ans);
return 0;
}