Cod sursa(job #1116715)

Utilizator vendettaSalajan Razvan vendetta Data 22 februarie 2014 19:23:01
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream f("wanted.in");
ofstream g("wanted.out");

#define pb push_back
#define sz size
#define mp make_pair
#define nmax 201
#define inf (1<<29)

int n;
pair<int,int> v[nmax];
int dp[nmax][nmax][2];

void citeste(){
    f >> n;
    for(int i=1; i<=n; ++i){
        int x, y; f >> x >> y;
        v[i] = mp(x, y);
    }
}

int modul(int X){
    if (X < 0) return -X;
    return X;
}

int dist(pair<int,int> A, pair<int,int> B){
    return B.second + modul(A.first - B.first) + A.second;
}

int rezolva(int Left, int Right, pair<int,int> t, int xx, int side){
    if (dp[Left][Right][side] != inf) return dp[Left][Right][side];
    if (Left >= Right){
        if (Left > Right) return 0;
        return dist( mp(v[Left].first, v[Left].second), t );
    }
    //cout << Left << " " << Right << "\n";

    int Min = inf; int oras = -1; pair<int, int> x;
    for(int k=Left; k<=Right; ++k){
        int A = dist(t, mp(v[k].first, v[k].second) ) + rezolva(Left, k-1, mp(v[k].first, v[k].second), k, 0);// 0 pt left
        int B = dist(t, mp(v[k].first, v[k].second) ) + rezolva(k+1, Right, mp(v[k].first, v[k].second), k, 1);
        //if (dp[Left][k-1] != inf) A += dp[Left[k-1];
        ///Min = min(Min, max(A, B) );
        if (Min > max(A,B)){
            Min = max(A,B);
            oras = k;
            if (A > B) x = mp(Left, k-1);
            else x = mp(k+1, Right);
        }
    }
    //g << Left << " " << Right << " " << Min<<" orasul in care ma duc: " <<oras << " si vin din : " << xx<< " intervalul ales : " << x.first << " " << x.second << "\n";// << " " << dist(t, mp(v[oras].first, v[oras].second)) << " " << t.first << " " << t.second <<"\n";
    dp[Left][Right][side] = Min;
    return Min;
}

int main(){
    pair<int, int> start = mp(0, 0);
    citeste();
    sort(v+1, v+n+1);
    for(int i=0; i<=n; ++i) for(int j=0; j<=n; ++j) dp[i][j][1] = dp[i][j][0] = inf;
    g << rezolva(1, n, start, 0, 0) << "\n";

    f.close();
    g.close();

    return 0;
}