Cod sursa(job #488147)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 27 septembrie 2010 20:11:45
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <stdio.h>
#include <algorithm>
#define Nmax 202
#define INF 2147000000

using namespace std;

struct punct { int x,y; } P[Nmax];
int a[Nmax][Nmax],b[Nmax][Nmax];
int N;

inline int cmp(punct a, punct b){
	return a.x < b.x;
}
inline int Minim(int x,int y){ return x<y ? x:y; }
inline int Maxim(int x,int y){ return x>y ? x:y; }
inline int Abs(int x){ return x>0 ? x:-x; }
inline int dist(int i,int j){
	return Abs(P[i].x-P[j].x)+P[i].y+P[j].y;
}

int main(){
	int i,j,k,rez,lg;
	freopen("wanted.in","r",stdin);
	freopen("wanted.out","w",stdout);
	scanf("%d",&N);
	for(i=1;i<=N;++i) scanf("%d%d",&P[i].x,&P[i].y);
	sort(P+1,P+N+1,cmp);
	
	for(i=2;i<=N;++i) a[i][i]=dist(i-1,i);
	for(i=1;i<N;++i) b[i][i]=dist(i,i+1);
	
	for(lg=2; lg<=N; ++lg)
		for(i=1;i+lg-1<=N;++i){
			j=i+lg-1;
			a[i][j]=b[i][j]=INF;
			
			if( i>1 )
			for(k=i; k<=j; ++k)
				a[i][j]=Minim(a[i][j], Maxim(b[i][k-1],a[k+1][j]) + dist(i-1,k));
			
			if( j<N )
			for(k=i; k<=j; ++k)
				b[i][j]=Minim(b[i][j], Maxim(b[i][k-1],a[k+1][j]) + dist(k,j+1));
		}
	
	rez=INF;
	for(k=1;k<=N;++k)
		rez=Minim(rez,Maxim(b[1][k-1],a[k+1][N])+dist(0,k));

	printf("%d\n",rez);
	fclose(stdin); fclose(stdout);
	return 0;
}