Pagini recente » Borderou de evaluare (job #1431480) | Borderou de evaluare (job #1378271) | Borderou de evaluare (job #1355205) | Borderou de evaluare (job #1272522) | Cod sursa (job #1494017)
#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;
}