Cod sursa(job #204967)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 28 august 2008 14:45:04
Problema Wanted Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
using namespace std;

#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <string>
#include <algorithm>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <queue>
#include <utility>
#include <functional>

#define pb psuh_back
#define x first
#define y second
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define all(v) v.begin()+1 , v.end()
#define C(v) C.erase( all(v) )
#define FORit(it,v) for(it = (v).begin();it != (v).end();++it)
#define mp make_pair
#define N_MAX 1<<9
#define oo 1<<30

#define IN "wanted.in"
#define OUT "wanted.out"

vector< pair<int,int>  > V(N_MAX);
int N;
int A[N_MAX][N_MAX],B[N_MAX][N_MAX];

void scan()
{
	freopen(IN, "r",stdin);
	freopen(OUT, "w",stdout);
	scanf("%d", &N);
	V.resize(N);
	FOR(i,1,N)
		scanf("%d%d", &V[i].x,&V[i].y);
	sort( all(V) );
}	

void solve()
{
	int rez(oo),worse;
	//for(int i=0;++i<=N;++i , A[i][i] = B[i][i] = V[i].y);
	FOR(i,1,N)
		A[i][i] = B[i][i] = abs(V[i].y);
	FOR(d,1,N)
	FOR(i,1,N-d)
	{ 
		int j = i + d;
		A[i][j] = B[i][j] = oo;
		FOR(k,i+1,j-1)
		{
			worse = max(A[k+1][j] + V[k+1].x - V[k].x , B[i][k-1] + V[k].x - V[k-1].x);
			A[i][j] = min(A[i][j], worse + V[k].x - V[i].x + (V[k].y<<1) );
			B[i][j] = min(B[i][j], worse + V[j].x - V[k].x + (V[k].y<<1) );
		}
		//k=i
		A[i][j] = min(A[i][j], (V[i].y<<1) + V[i+1].x - V[i].x + A[i+1][j]);
		B[i][j] = min(B[i][j], (V[i].y<<1) + V[j].x - V[i].x + V[i+1].x - V[i].x + A[i+1][j]);
		//k=j
		A[i][j] = min(A[i][j], (V[j].y<<1) + V[j].x - V[i].x + V[j].x - V[j-1].x + B[i][j-1]);
		B[i][j] = min(B[i][j], (V[j].y<<1) + V[j].x - V[j-1].x + B[i][j-1]);
	}
	
/*	FOR(i,1,N)
	{
		FOR(j,1,N)
			printf("%d ",A[i][j]);
		printf("\n");
	}
	FOR(i,1,N)
	{
		FOR(j,1,N)
			printf("%d ",B[i][j]);
		printf("\n");
	}
*/	
	FOR(i,2,N-1)
		rez = min(rez, abs(V[i].x) + (V[i].y<<1) + max(V[i].x - V[i-1].x + B[1][i-1] , V[i+1].x - V[i].x + A[i+1][N]));
	rez = min(rez,abs(V[1].x) + (V[1].y<<1) + V[2].x - V[1].x + A[2][N]);
	rez = min(rez,abs(V[N].x) + (V[N].y<<1) + V[N].x - V[N - 1].x + B[1][N - 1]);
	printf("%d\n",rez);
}	

int main()
{
	scan();
	solve();
	return 0;
}