Cod sursa(job #1494017)

Utilizator akaprosAna Kapros akapros Data 30 septembrie 2015 14:19:21
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#define inf 1000000000
#define maxN 202
using namespace std;
int n, i, j, dp[2][maxN][maxN];
struct coord
{
    int x;
    int y;
}v[maxN];
int cmp(const coord a, const coord b)
{
    if (a.x == b.x)
        return a.y < b.y;
    return a.x < b.x;
}
int dist(int a, int b)
{
    if (a > n || b > n)
    return 0;
    return abs(v[a].x - v[b].x) + v[b].y + v[a].y;
}
void read()
{
    freopen("wanted.in", "r", stdin);
    scanf("%d", &n);
    for (i = 1; i <=n; ++ i)
        scanf("%d %d", &v[i].x, &v[i].y);
    sort(v + 1, v + n + 1, cmp);
}
void solve()
{
    int vmin, k;
    sort(v + 1, v + n + 1, cmp);
    for (i = 1; i <= n; ++ i)
    {
        dp[0][i][i] = dist(i, i - 1);
        dp[1][i][i] = dist(i, i + 1);
    }
    for (i = n - 1; i >= 1 ; -- i)
        for (j = i + 1; j <= n; ++ j)
    {
        vmin = inf;
        for (k = i; k <= j; ++ k)
            if (vmin > max(dp[0][k + 1][j], dp[1][i][k - 1]) + dist(j + 1, k))
               vmin = max(dp[0][k + 1][j], dp[1][i][k - 1]) + dist(j + 1, k);
        dp[1][i][j] = vmin;

        vmin = inf;
        for (k = i; k <= j; ++ k)
        if (vmin > max(dp[0][k + 1][j], dp[1][i][k - 1]) + dist(i - 1, k))
               vmin = max(dp[0][k + 1][j], dp[1][i][k - 1]) + dist(i - 1, k);
        dp[0][i][j] = vmin;
    }
}
void write()
{
    freopen("wanted.out", "w", stdout);
    printf("%d", dp[0][1][n]);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}