Pagini recente » Cod sursa (job #534136) | Cod sursa (job #2768539) | Cod sursa (job #1583294) | Cod sursa (job #2971083) | Cod sursa (job #2147346)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string.h>
using namespace std;
int N;
const int oo = 2e9;
pair <int, int> A [205];
inline int modul(int x)
{
return (x > 0 ? x : -x);
}
int64_t d[2][205][205];
int64_t dinamica(int st, int dr, int start)
{
int dir = (st > start); //dc st > start trebe sa mergem sprea dreapta (1), dc nu spre stanga (0)
if(st > dr)
return 0;
//nu repetam subcazuri deja facute
if(d[dir][st][dr] != -1)
return d[dir][st][dr];
d[dir][st][dr] = oo;
for(int i = st; i <= dr; ++i)
{
int64_t temp = max(dinamica(st, i - 1, i), dinamica(i + 1, dr, i));
temp += A[start].second + A[i].second + modul(A[start].first - A[i].first);
d[dir][st][dr] = min (d[dir][st][dr], temp);
}
return d[dir][st][dr];
}
int main()
{
ifstream in ("wanted.in");
ofstream out ("wanted.out");
in>>N;
for (int i = 1; i <= N; ++i)
in>>A[i].first>>A[i].second;
sort(A + 1, A + N + 1);
memset(d, -1, sizeof (d));
out<<dinamica(1, N, 0);
return 0;
}