Cod sursa(job #168337)

Utilizator devilkindSavin Tiberiu devilkind Data 31 martie 2008 00:12:57
Problema Wanted Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <math.h>

using namespace std;

#define NMAX 256
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
#define INF 0x3f3f3f3f

vector< pair<int,int> > v;
pair<int,int> a[NMAX][NMAX];
int n;

inline int dist( int x, int y)
{
	int ret;
	ret=abs( v[x].ff - v[y].ff ) + v[x].ss + v[y].ss; 
	return ret;
}

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

	int x,y,i,j,k,cx,cy;

	scanf("%d",&n);

	for (i=0;i<n;i++)
	{
		scanf("%d %d",&x,&y);
		v.pb( mp(x, abs(y) ) );
	}

	sort(v.begin(),v.end());

	for (i=0;i<n;i++)
		{
		a[i][i].ff=0;
		a[i][i].ss=0;
		}

	for (i=0;i<n-1;i++)
		{
			a[i][i+1].ff=dist(i,i+1);
			a[i][i+1].ss=dist(i,i+1);
		}

	for (j=2;j<n;j++)
		for (i=0;i+j<n;i++)
		{
			x=i;y=i+j;
//			cx=dist(x,y)+a[x+1][y].ss;
//			cy=dist(x,y)+a[x][y-1].ff;
			cx=INF;cy=INF;
			for (k=x+1;k<y;k++)
				{	
					if (k==x+1) cx=min(cx, a[k][y].ff + dist(x,k) );
						else cx=min(cx, max( a[x+1][k].ss,a[k][y].ff ) + dist(x,k) );
				
					if (k==y-1) cy=min(cy, a[x][k].ff + dist(k,y) ); 
						else cy=min(cy, max( a[x][k].ss,a[k][y-1].ff ) + dist(k,y) );
				}
			a[x][y].ff=cx;
			a[x][y].ss=cy;
		}

	int sol=INF;


	for (i=0;i<n;i++)
		sol=min(sol, max(a[0][i].ss,a[i][n-1].ff) + abs(v[i].ff) + v[i].ss );
	printf("%d",sol);
	return 0;
}