Cod sursa(job #493647)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 18 octombrie 2010 21:30:19
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define nmax 210

struct punct
{
	int x, y;
} v[nmax];

int cmp(punct a, punct b)
{
	return a.x<b.x;
}

int n, a[nmax][nmax], b[nmax][nmax], sol;
char f[nmax][nmax];

int dist(int p, int d)
{
	if (p==d) return 0;
	return v[p].y+v[d].y+v[d].x-v[p].x;
}

void solve(int p, int d)
{
	if (f[p][d]) return ;
	f[p][d]=1;
	int i, c;
	for (i=p; i<=d; i++)
	{
		solve(p,i-1);
		solve(i+1,d);
		c=max(b[p][i-1], a[i+1][d]);
		a[p][d]=min(a[p][d], c+dist(p-1, i));
		b[p][d]=min(b[p][d], c+dist(i, d+1));
	}
}

int main()
{
	freopen("wanted.in","r",stdin);
	freopen("wanted.out","w",stdout);
	scanf("%d",&n);
	int i, c, j;
	for (i=1; i<=n; i++) scanf("%d %d",&v[i].x,&v[i].y);
	sort (v+1, v+n+1, cmp);
	v[n+1].y=v[0].y=1<<30;
	for (i=1; i<=n; i++)
		for (j=i; j<=n; j++)
			a[i][j]=b[i][j]=1<<30;
	solve(1,n);
	sol=1<<30;
	for (i=1; i<=n; i++) 
	{
		j=v[i].x;
		if (j<0) j=-j;
		j+=v[i].y;
		c=j+max(b[1][i-1], a[i+1][n]);
		sol=min(sol, c);
	}
	printf("%d\n",sol);
}