Pagini recente » Cod sursa (job #1177897) | Cod sursa (job #952945) | Cod sursa (job #157564) | Cod sursa (job #2017114) | Cod sursa (job #1489984)
/// 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;
}