Pagini recente » Cod sursa (job #845487) | Cod sursa (job #1942131) | Cod sursa (job #1031266) | Cod sursa (job #524857) | Cod sursa (job #1229099)
#include<cstdio>
#include<algorithm>
using namespace std;
int n, x[209], y[209], p[209];
long long v, ans, dp[209][209][2];
long long mod (int x)
{
if ( x < 0 ) return -x;
return x;
}
long long dist (int p1, int p2)
{
return mod(y[p1]) + mod(y[p2]) + mod ( x[p1] - x[p2] );
}
bool cmp (int p1, int p2)
{
return ( x[p1] < x[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] = (1LL<<60);
for (int i = n; i >= 1; i--)
for (int j = i; j <= n; j++)
{
if ( i==j )
{
if ( i > 1 ) dp[i][j][0] = dist (p[i-1], p[i] );
if ( i < n ) dp[i][j][1] = dist (p[i], p[i+1] );
continue;
}
if (i>1)
{
for (int k=i; k<=j; k++)
{
v = dp[i][k-1][1];
if ( v >= (1LL<<60) ) v = dp[k+1][j][0];
else
if (dp[k+1][j][0] < (1LL<<60) ) v = max (v, dp[k+1][j][0] );
if (v >= (1LL<<60) ) v = 0;
dp[i][j][0] = min ( dp[i][j][0], v + dist ( p[i-1], p[k] ) );
}
}
if (j<n)
{
for (int k=i; k<=j; k++)
{
v = dp[i][k-1][1];
if ( v >= (1LL<<60) ) v = dp[k+1][j][0];
else
if (dp[k+1][j][0] < (1LL<<60) ) v = max (v, dp[k+1][j][0] );
if (v >= (1LL<<60) ) v = 0;
dp[i][j][1] = min ( dp[i][j][1], v + dist ( p[j+1], p[k] ) );
}
}
}
ans = (1LL<<60);
for (int i=1; i<=n; i++)
{
v = dp[1][p[i]-1][1];
if ( v>= (1LL<<60) ) v = dp[p[i]+1][n][0];
else
if ( dp[p[i]+1][n][0] < (1LL<<60) ) v = max (v, dp[p[i]+1][n][0] );
if (v >= (1LL<<60) ) v = 0;
ans = min(ans, max(dp[1][p[i]-1][1], dp[p[i]+1][n][0]) + mod(x[p[i]]) + mod(y[p[i]]) );
}
printf ("%lld\n", ans);
return 0;
}