Pagini recente » Cod sursa (job #256082) | Cod sursa (job #2836218) | Cod sursa (job #2636842) | Cod sursa (job #1767486) | Cod sursa (job #2215734)
#include <fstream>
#include <algorithm>
#include <cmath>
#define x first
#define y second
using namespace std;
ifstream cin ("wanted.in");
ofstream cout ("wanted.out");
typedef pair <int, int> Point;
const int NMAX = 201;
const int INF = 2000000000;
int n;
Point v[1 + NMAX];
int dp[2][1 + NMAX][1 + NMAX];
int dist(Point a, Point b) {
return abs(b.x - a.x) + a.y + b.y;
}
int main() {
cin >> n;
for(int i = 1; i <= n; i++)
cin >> v[i].x >> v[i].y;
sort(v + 1, v + n + 1);
for(int i = 2; i <= n; i++)
dp[0][i][i] = dist(v[i - 1], v[i]);
for(int i = 1; i < n; i++)
dp[1][i][i] = dist(v[i], v[i + 1]);
// dp[0][i][j] = distanta min pt a verifica intervalul (i, j) daca pornesc din satul i - 1
// dp[1][i][j] = distanta min pt a verifica intervalul (i, j) daca pornesc din satul j + 1
for(int d = 2; d < n; d++) {
for(int i = 1; i <= n; i++) {
int j = i + d - 1;
dp[0][i][j] = dp[1][i][j] = INF;
for(int k = i; k <= j; k++) {
if(i > 1)
dp[0][i][j] = min(dp[0][i][j], dist(v[i - 1], v[k]) + max(dp[0][k + 1][j], dp[1][i][k - 1]));
if(j < n)
dp[1][i][j] = min(dp[1][i][j], dist(v[k], v[j + 1]) + max(dp[0][k + 1][j], dp[1][i][k - 1]));
}
}
}
int sol = INF;
for(int i = 1; i <= n; i++)
sol = min(sol, dist(make_pair(0, 0), v[i]) + max(dp[0][i + 1][n], dp[1][1][i - 1]));
cout << sol;
return 0;
}