Pagini recente » Cod sursa (job #1415641) | Cod sursa (job #249010) | Cod sursa (job #102804) | Cod sursa (job #1443285) | Cod sursa (job #1457807)
#include <fstream>
#include <iostream>
#include <vector>
#include <utility>
#include <limits>
#include <algorithm>
using namespace std;
constexpr long long inf = numeric_limits<decltype(inf)>::max();
int dist(const int a, const int b){
return (a < b) ? (b-a) : (a-b); }
int dist(const pair<int, int> a, const pair<int, int> b){
return dist(a.first, b.first) + a.second + b.second; }
int main(){
ifstream f("wanted.in");
ofstream g("wanted.out");
int n;
f >> n;
vector<pair<int, int> > v(n);
for(auto& x : v){
f >> x.first >> x.second; }
sort(begin(v), end(v), [](const pair<int, int> a, const pair<int, int> b){
return a.first < b.first; });
vector<vector<vector<long long> > > d(v.size(), vector<vector<long long> >(v.size(),
vector<long long>(v.size(), 0)));
for(int nod = 0; nod < v.size(); ++nod){
for(int de_la = 0; de_la < v.size(); ++de_la){
if(nod == de_la){
d[nod][nod][de_la] = 0; }
else{
d[nod][nod][de_la] = dist(v[nod], v[de_la]); } } }
for(int delta = 2; delta <= v.size(); ++delta){
for(int st = 0, fin = st+delta-1; fin < v.size(); ++st, ++fin){
d[st][fin][st] = d[st+1][fin][st];
d[st][fin][fin] = d[st][fin-1][fin];
for(int de_la = st+1; de_la < fin; ++de_la){
d[st][fin][de_la] = max(
d[st][de_la-1][de_la],
d[de_la+1][fin][de_la]); }
pair<int, int> left_point(v[st].first, 0),
right_point(v[fin].first, 0);
long long left_point_best = inf,
right_point_best = inf;
for(int dest = st; dest <= fin; ++dest){
left_point_best = min(left_point_best,
(dist(left_point, v[dest]) +
d[st][fin][dest]));
right_point_best = min(right_point_best,
(dist(right_point, v[dest]) +
d[st][fin][dest])); }
for(int de_la = 0; de_la < st; ++de_la){
d[st][fin][de_la] = dist(v[de_la], left_point)
+ left_point_best; }
for(int de_la = fin+1; de_la < v.size(); ++de_la){
d[st][fin][de_la] = dist(v[de_la], right_point)
+ right_point_best; } } }
long long rez = inf;
for(int i = 0; i < v.size(); ++i){
rez = min(rez, d[0][v.size()-1][i] + dist(make_pair(0, 0), v[i])); }
g << rez;
return 0; }