Pagini recente » Cod sursa (job #2376295) | Cod sursa (job #1881550) | Cod sursa (job #269612) | Cod sursa (job #2894711) | Cod sursa (job #2913641)
#include <fstream>
#include <algorithm>
#include <cmath>
#define int long long
using namespace std;
const int MAX_N = 2 * 1e2;
const int INF = (1LL << 50);
int dp1[MAX_N + 1][MAX_N + 1], dp2[MAX_N + 1][MAX_N + 1];
int n;
struct point {
int x;
int y;
};
bool operator < (const point &a, const point &b) {
return a.x < b.x || (a.x == b.x && a.y < b.y);
}
point a[MAX_N + 1];
int dist(point a, point b) {
return abs(b.x - a.x) + b.y + a.y;
}
signed main() {
ifstream fin("wanted.in");
ofstream fout("wanted.out");
fin >> n;
for (int i = 1; i <= n; i++) {
fin >> a[i].x >> a[i].y;
}
sort(a + 1, a + n + 1);
for (int i = 1; i <= n; i++) {
for (int j = i; j <= n; j++) {
dp1[i][j] = INF;
dp2[i][j] = INF;
}
}
for (int i = 2; i <= n; i++) {
dp1[i][i] = dist(a[i - 1], a[i]);
}
for (int i = 1; i <= n - 1; i++) {
dp2[i][i] = dist(a[i], a[i + 1]);
}
for (int h = 2; h <= n; h++) {
for (int i = 1; i + h - 1 <= n; i++) {
int j = i + h - 1;
for (int k = i; k <= j; k++) {
if (i > 1) {
dp1[i][j] = min(dp1[i][j], dist(a[i - 1], a[k]) + max(dp1[k + 1][j], dp2[i][k - 1]));
}
if (j < n) {
dp2[i][j] = min(dp2[i][j], dist(a[k], a[j + 1]) + max(dp1[k + 1][j], dp2[i][k - 1]));
}
}
}
}
int answer = INF;
for (int i = 1; i <= n; i++) {
int aux = dist(point {0, 0}, a[i]) + max(dp1[i + 1][n], dp2[1][i - 1]);
answer = min(answer, aux);
}
fout << answer;
return 0;
}