Pagini recente » Cod sursa (job #714879) | summer-challenge-2021/solutii/petreceri | Cod sursa (job #2574163) | Cod sursa (job #2648056) | Cod sursa (job #2828259)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("wanted.in");
ofstream fout("wanted.out");
const int inf = 0x3f3f3f3f;
int n, ans;
int dl[205][205], dr[205][205];
struct oras {
int x, y;
}v[205];
bool cmp(oras a, oras b)
{
return a.x < b.x;
}
int dist(int a, int b)
{
return abs(v[b].x - v[a].x) + v[a].y + v[b].y;
}
int main()
{
fin >> n;
for(int i = 1; i <= n; i++)
fin >> v[i].x >> v[i].y;
sort(v + 1, v + n + 1, cmp);
for(int i = 1; i <= n; i++)
{
if(i != 1)
dl[i][i] = dist(i, i - 1);
if(i != n)
dr[i][i] = dist(i, i + 1);
}
for(int d = 1; d <= n - 2; d++)
{
for(int i = 1; i <= n; i++)
{
int j = i + d;
dl[i][j] = inf, dr[i][j] = inf;
for(int k = i; k <= j; k++)
{
if(i != 1)
dl[i][j] = min(dl[i][j], dist(i - 1, k) + max(dl[k + 1][j], dr[i][k - 1]));
if(j != n)
dr[i][j] = min(dr[i][j], dist(k, j + 1) + max(dl[k + 1][j], dr[i][k - 1]));
}
}
}
ans = inf;
for(int i = 1; i <= n; i++)
ans = min(ans, dist(0, i) + max(dl[i + 1][n], dr[1][i - 1]));
fout << ans;
return 0;
}