/* * SOLUZIONE UFFICIALE - task torri * Complessità temporale O(N*H) * Complessità in memoria O(N*H) * * Alessio Mazzetto */ #include #include #include #include #include #include using namespace std; const int MAXN = 1005; const int MAXH = 1005; // numero di torri int N; // memoizzazione della soluzione dinamica int dp[MAXN][MAXH]; int alt[MAXN]; // altezza torri int c[MAXN]; // costo per demolire torre int sum; // Costo di tutte le altezze // programmazione dinamica top-down // torna la somma delle torri ancora in piedi int solve(int p, int h) { if(p == N) return 0; // sono arrivato alla fine if(dp[p][h] != -1) return dp[p][h]; // memoizzazione int ans = 0; // se devo ancora scegliere una torre o la torre soddisfa la descrescenza "la tengo" if( (h == 0) || (h > alt[p])) ans = solve(p+1,alt[p]) + c[p]; ans = max(ans,solve(p+1,h)); // se no la butto giù return dp[p][h] = ans; } int main() { #ifdef EVAL ifstream in("input.txt"); ofstream out("output.txt"); #else #define in cin #define out cout #endif //lettura input sum = 0; in >> N; for (int i = 0; i < N; i++) { in >> alt[i] >> c[i]; sum+= c[i]; } memset(dp,-1,sizeof(dp)); // Inizializzo dp per memoizzazione out << sum - solve(0,0) << endl; return 0; }