Cod sursa(job #1489984)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 22 septembrie 2015 15:41:09
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
/// featuring Andrei Stefan

#include <bits/stdc++.h>

#define F first
#define S second

using namespace std;

const int Nmax = 200 + 10;

int n , i , j , k , lenght , v , ans;

int x[Nmax] , h[Nmax];
pair < int , int > a[Nmax];
int d[Nmax][Nmax][2];

int main()
{
    freopen("wanted.in","r",stdin);
    freopen("wanted.out","w",stdout);

    scanf("%d", &n);
    for (i = 1; i <= n; ++i)
        scanf("%d %d", &a[i].F , &a[i].S);

    sort(a + 1 , a + n + 1);
    for (i = 1; i <= n; ++i)
        tie(x[i] , h[i]) = a[i];

    for (i = 2; i <= n; ++i)
        d[1][i][0] = h[i] + (x[i] - x[i-1]);
    for (i = 1; i < n; ++i)
        d[1][i][1] = h[i] + (x[i+1] - x[i]);

    for (lenght = 2; lenght <= n; ++lenght)
        for (i = 1; i <= n - lenght + 1; ++i)
        {
            j = i + lenght - 1;

            if (i >= 2)
            {
                d[lenght][i][0] = INT_MAX;
                for (k = i; k <= j; ++k)
                {
                    v = max(d[k-i][i][1] , d[j-k][k+1][0]) + (h[k] << 1) + (x[k] - x[i-1]);
                    d[lenght][i][0] = min(d[lenght][i][0] , v);
                }
            }

            if (j < n)
            {
                d[lenght][i][1] = INT_MAX;
                for (k = i; k <= j; ++k)
                {
                    v = max(d[k-i][i][1] , d[j-k][k+1][0]) + (h[k] << 1) + (x[j+1] - x[k]);
                    d[lenght][i][1] = min(d[lenght][i][1] , v);
                }
            }
        }

    ans = INT_MAX;
    for (i = 2; i < n; ++i)
    {
        v = max(d[i-1][1][1] , d[n-i][i+1][0]) + ((x[i] < 0) ? -x[i] : x[i]) + (h[i] << 1);
        ans = min(ans , v);
    }

    ans = min(ans , d[n-1][2][0] + ((x[1] < 0) ? -x[1] : x[1]) + (h[1] << 1));
    ans = min(ans , d[n-1][1][1] + ((x[n] < 0) ? -x[n] : x[n]) + (h[n] << 1));

    printf("%d\n", ans);

    return 0;
}