Cod sursa(job #2971266)

Utilizator BlueLuca888Girbovan Robert Luca BlueLuca888 Data 26 ianuarie 2023 22:01:34
Problema Wanted Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#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];

long long mem[MAX_N + 5][MAX_N + 5][MAX_N + 5];
long long sol;
static inline long long solve(int st, int dr, int index){

    if(st > dr)
        return 0;

    if(mem[st][dr][index] == 0){
        if(st == dr){
            mem[st][dr][index] = abs(o[index].x - o[st].x) + o[st].y;
        }else{
            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[st][dr][index] = best;
        }
    }
    return mem[st][dr][index];
}

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;
}
/**
4
-10 3
-5 2
5 4
8 2
**/