Cod sursa(job #1229095)

Utilizator geniucosOncescu Costin geniucos Data 16 septembrie 2014 13:24:20
Problema Wanted Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include<cstdio>
#include<algorithm>

using namespace std;

int v, 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)
{
    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] = 1<<28;

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;
        }
        for (int k=i; k<=j; k++)
        {
            v = dp[i][k-1][1];
            if ( v >= (1<<28) ) v = dp[k+1][j][0];
            else
            if (dp[k+1][j][0] < (1<<28) ) v = max (v, dp[k+1][j][0] );

            dp[i][j][0] = min ( dp[i][j][0], v +  dist ( p[i-1], p[k] ) );
        }
        for (int k=i; k<=j; k++)
        {
            v = dp[i][k-1][1];
            if ( v >= (1<<28) ) v = dp[k+1][j][0];
            else
            if (dp[k+1][j][0] < (1<<28) ) v = max (v, dp[k+1][j][0] );

            dp[i][j][1] = min ( dp[i][j][1], v +  dist ( p[j+1], p[k] ) );
        }
    }

ans = 1<<28;
for (int i=1; i<=n; i++)
    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 ("%d\n", ans);

return 0;
}