Pagini recente » Cod sursa (job #1743964) | Cod sursa (job #1715745) | Cod sursa (job #2321921) | Cod sursa (job #649314) | Cod sursa (job #168396)
Cod sursa(job #168396)
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
#define nm 205
#define inf 2000000000
int n, c[nm][nm][2], sol;
vector< pair<int, int> > v;
int max(int x, int y)
{
if (x > y)
return x;
return y;
}
void find(int x, int y, int p)
{
if (c[x][y][p] > -1)
return;
if (x > y) {
c[x][y][p] = 0;
return;
}
if (x == y) {
if (p == 0)
c[x][y][p] = v[x].first - v[x - 1].first + v[x - 1].second + v[x].second;
else
c[x][y][p] = v[y + 1].first - v[x].first + v[y + 1].second + v[x].second;
return;
}
c[x][y][p] = inf;
for (int i = x; i <= y; ++i) {
find(x, i - 1, 1);
find(i + 1, y, 0);
int tmp;
if (p == 0)
tmp = v[i].first - v[x - 1].first + v[x - 1].second;
else
tmp = v[y + 1].first - v[i].first + v[y + 1].second;
if (c[x][y][p] > max(c[x][i - 1][1], c[i + 1][y][0]) + tmp + v[i].second)
c[x][y][p] = max(c[x][i - 1][1], c[i + 1][y][0]) + tmp + v[i].second;
}
}
int main()
{
freopen("wanted.in", "r", stdin);
freopen("wanted.out", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
int x, y;
scanf("%d %d", &x, &y);
v.push_back(make_pair(x, y));
}
sort(v.begin(), v.end());
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
for (int k = 0; k <= 1; ++k)
c[i][j][k] = -1;
sol = inf;
for (int i = 0; i < n; ++i) {
find(0, i - 1, 1);
find(i + 1, n - 1, 0);
int tmp;
if (v[i].first > 0)
tmp = v[i].first;
else
tmp = -v[i].first;
if (sol > max(c[0][i - 1][1], c[i + 1][n - 1][0]) + tmp + v[i].second)
sol = max(c[0][i - 1][1], c[i + 1][n - 1][0]) + tmp + v[i].second;
}
printf("%d\n", sol);
/*
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
for (int k = 0; k <= 1; ++k)
printf("%d %d %d %d\n", i, j, k, c[i][j][k]);
*/
return 0;
}