Cod sursa(job #1749873)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 28 august 2016 23:19:49
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <fstream>
#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <map>
#include <algorithm>
#define pb push_back
#define NMAX 205
#define INF 0x3f3f3f3f

using namespace std;

typedef pair<int, int> pii;

ifstream fin("wanted.in");
ofstream fout("wanted.out");

pii v[NMAX];
int dist[NMAX][NMAX],st[NMAX][NMAX],dr[NMAX][NMAX];

int main() {
	int n,i,x,y,s=0,j,k,val;

	fin>>n;
	for(i=1;i<=n;++i) fin>>v[i].first>>v[i].second;
	sort(v+1,v+n+1);

	for(i=0;i<=n;++i)
		for(j=0;j<=n;++j)
			dist[i][j]=abs(v[i].first-v[j].first)+v[i].second+v[j].second;

	for(i=1;i<=n;++i) {
		dr[i][i]=dist[i][i-1];
		st[i][i]=dist[i][i+1];
	}

	for(i=n-1;i>0;--i) {
		for(j=i+1;j<=n;++j) {
			st[i][j]=INF;
			for(k=i;k<=j;++k)
				st[i][j]=min(st[i][j], max(dr[k+1][j]+dist[k][j+1], st[i][k-1]+dist[k][j+1]));

			dr[i][j]=INF;
			for(k=i;k<=j;++k)
				dr[i][j]=min(dr[i][j], max(dr[k+1][j]+dist[k][i-1], st[i][k-1]+dist[k][i-1]));
		}
	}

	fout<<dr[1][n];

	return 0;
}