Cod sursa(job #475591)

Utilizator ProtomanAndrei Purice Protoman Data 7 august 2010 16:32:16
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <algorithm>
#include <stdio.h>

#define MAX 512
#define x first
#define y second

using namespace std;

int n, sol = LONG_MAX;
int solJ[MAX][MAX], solS[MAX][MAX];
pair <int, int> c[MAX];

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

	scanf("%d", &n);

	for (int i = 1; i <= n; i++)
		scanf("%d %d", &c[i].x, &c[i].y);

	sort(c + 1, c + 1 + n);
	
	c[0].x = -10000;
	c[n + 1].y = 10000;
	for (int l = 1; l <= n; l++)
		for (int i = 1; i <= n + 1 - l; i++)
		{
			int j = i + l - 1;
			solJ[i][j] = solS[i][j] = LONG_MAX;
			for (int k = i; k <= j; k++)
			{
				solJ[i][j] = min(solJ[i][j], max(solS[i][k - 1], solJ[k + 1][j]) + c[i - 1].y + (c[k].x - c[i - 1].x) + c[k].y);
				solS[i][j] = min(solS[i][j], max(solS[i][k - 1], solJ[k + 1][j]) + c[j + 1].y + (c[j + 1].x - c[k].x) + c[k].y);
			}
		}

	for (int k = 1; k <= n; k++)
		sol = min(sol, max(solS[1][k - 1], solJ[k + 1][n]) + c[k].y + abs(c[k].x));

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

	fclose(stdin);
	fclose(stdout);
	return 0;
}