Pagini recente » Cod sursa (job #2202249) | Cod sursa (job #169551) | Cod sursa (job #1341361) | Cod sursa (job #3161278) | Cod sursa (job #2147911)
#include <bits/stdc++.h>
using namespace std;
int n;
long long d[2][205][205];
struct Town{
int x, y;
bool operator < (const Town &aux) const{
return x < aux.x;
}
};
Town a[205];
inline void Solve(int st, int dr, int X, bool ok){
if(d[ok][st][dr]) return ;
if(st == dr){
d[ok][st][st] = a[st].y + abs(X - a[st].x);
return ;
}
d[ok][st][dr] = 20000000000;
for(int i = st; i <= dr ; ++i){
int dist = abs(X - a[i].x) + a[i].y * 2;
if(st == 1 && dr == 4){
bool ok = 0;
}
if(i == st) {
Solve(st + 1, dr, a[i].x, 0);
d[ok][st][dr] = min(d[ok][st][dr], d[0][st + 1][dr] + dist);
}
else if(i == dr){
Solve(st, dr - 1, a[i].x, 1);
d[ok][st][dr] = min(d[ok][st][dr], d[1][st][dr - 1] + dist);
}
else{
Solve(st, i - 1, a[i].x, 1);
Solve(i + 1, dr, a[i].x, 0);
d[ok][st][dr] = min(max(d[1][st][i - 1] + dist, d[0][i + 1][dr] + dist), d[ok][st][dr]);
}
}
}
int main()
{
freopen("wanted.in", "r", stdin);
freopen("wanted.out", "w", stdout);
scanf("%d", &n);
for(int i = 1; i <= n ; ++i)
scanf("%d%d", &a[i].x, &a[i].y);
sort(a + 1, a + n + 1);
Solve(1, n, 0, 0);
printf("%lld", d[0][1][n]);
return 0;
}