Pagini recente » Cod sursa (job #2564182) | Cod sursa (job #1330925) | Cod sursa (job #3283794) | Cod sursa (job #46892) | Cod sursa (job #2971275)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("wanted.in");
ofstream fout ("wanted.out");
const int MAX_N = 200;
int n;
struct oras{
int x, y;
inline bool operator < (const oras &rhs) const{
return x < rhs.x;
}
} o[MAX_N + 5];
multimap <pair<int, pair<int, int>>, long long> mem;
long long best;
static inline long long solve(int st, int dr, int index){
if(st > dr)
return 0;
if(st == dr)
return abs(o[index].x - o[st].x) + o[st].y;
pair<int, pair<int, int>> crt = {st, {dr, index}};
if(mem.find(crt) == mem.end()){
long long best;
for(int md=st; md<=dr; md++){
///merg de la o[index] la o[md]
long long answer = abs(o[index].x - o[md].x);
///vizitez oras-ul o[md]
answer += 2 * o[md].y;
///in functie de raspuns ma duc in stanga respectiv dreapta
answer += max(solve(st, md-1, md), solve(md+1, dr, md));
///cel mai bun traseu
if(md == st)
best = answer;
else
best = min(best, answer);
}
mem.insert(make_pair(crt, best));
}
return (*mem.find(crt)).second;
}
int main (){
ios_base::sync_with_stdio(false);
fin.tie(nullptr), fout.tie(nullptr);
fin>>n;
o[0] = {0, 0};
for(int i=1; i<=n; i++)
fin>>o[i].x>>o[i].y;
sort(o+1, o+n+1);
fout<<solve(1, n, 0);
return 0;
}