#include #include #include #define NDEBUG using namespace std; const int MAXN = 1000; const int MAXH = 1000; int c[MAXN+2]; int h[MAXN+2]; // p[i]: costo minimo per costruire catena descrescente lasciando intatto il palazzo i. int p[MAXN+2]; int N; int main() { ifstream in("input.txt"); assert(in); in >> N; // Sentinella. h[0] = MAXH+1; c[0] = 0; for ( int i = 1; i <= N; ++i ) in >> h[i] >> c[i]; in.close(); p[N] = 0; for ( int i = N-1; i >= 0; --i ) { p[i] = numeric_limits::max(); int costo_demolizione = 0; for ( int j = i+1; j <= N; ++j ) { // Posso non demolire il palazzo j. if ( h[j] < h[i] && p[i] > costo_demolizione + p[j] ) p[i] = p[j] + costo_demolizione; // Provo a proseguire demolendo il palazzo. costo_demolizione += c[j]; } // Mi conviene non demolire solo il palazzo i. if ( p[i] > costo_demolizione ) p[i] = costo_demolizione; } ofstream out("output.txt"); out << p[0] << endl; out.close(); return 0; }