Cod sursa(job #168396)

Utilizator sims_glAlexandru Simion sims_gl Data 31 martie 2008 11:45:27
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#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;
}