Cod sursa(job #1807129)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 16 noiembrie 2016 01:28:57
Problema Wanted Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <fstream>
#include <algorithm>
#include <cmath>

std::ifstream in ( "wanted.in"  );
std::ofstream out( "wanted.out" );

const int DIM = 2e2 + 5;
const long long INF = 1e18 + 5;

std::pair<int, int> pt[DIM];
long long dp[DIM][DIM][2];

int main( int argc, const char *argv[] ) {
    std::ios::sync_with_stdio( false );
    int n; in >> n;
    for( int i = 1; i <= n; i ++ ) {
        in >> pt[i].first >> pt[i].second; }
    std::sort( pt + 1, pt + n + 1 );
    for( int p = 1; p <= n; p ++ ) {
    for( int i = 1, j = i + p - 1; j <= n; i ++, j ++ ) {
        dp[i][j][0] = dp[i][j][1] = INF;
        for( int k = i; k <= j; k ++ ) {
            long long c1 = std::max( dp[i][k - 1][1], dp[k + 1][j][0] );
            int c2 = std::abs( pt[i - 1].first - pt[k].first ) + pt[i - 1].second + pt[k].second;
            int c3 = std::abs( pt[j + 1].first - pt[k].first ) + pt[j + 1].second + pt[k].second;
            if( i > 0 ) { dp[i][j][0] = std::min( dp[i][j][0], c1 + c2 ); }
            if( j < n ) { dp[i][j][1] = std::min( dp[i][j][1], c1 + c3 ); } } } }
    out << dp[1][n][0] << std::endl;
    return 0; }