/* FILE: collage_selfcertifying_feasibility.cpp last change: 20-Sept-2012 author: Romeo Rizzi * a solver for problem "collage" in the 28-Sept-2012 exam in Algorithms. */ //#define NDEBUG // NDEBUG disabilita tutte le assert se definita prima di includere #include #ifndef NDEBUG # include // non voglio includerla quando Non compilo in modalita' DEBUG #endif #include using namespace std; const int MAX_N = 1000; int n; int color[MAX_N]; int memo[MAX_N +1][MAX_N +1]; const int UNKNOWN = -1; const int LOOK = -2; const int DROP = -1; void ric(int i, int j, bool opened = false) { if (i>j) return; if (!opened) cout << color[i] << " " << LOOK << " "; if( memo[i][j] == 1 + memo[i+1][j] ) { cout << DROP << " "; ric(i+1,j); return; } int sec; for (sec = 1; i+sec <= j; ++sec) if ((color[i+sec] == color[i]) && (memo[i][j] == memo[i+1][i+sec-1] + memo[i+sec][j])) { ric(i+1, i+sec-1); cout << LOOK << " "; ric(i+sec, j, true); return; } } int main (int argc, char** argv) { ifstream in("input.txt"); assert( in ); in >> n; for(int i = 0; i < n; ++i) in >> color[i]; in.close(); for(int i = n-1; i >= 0; --i) for(int j = 0; j < n; ++j) if( i>j ) memo[i][j] = 0; else { memo[i][j] = 1 + memo[i+1][j]; for(int sec = 1; i + sec <= j; ++sec) if( color[i+sec] == color[i] ) memo[i][j] = min(memo[i][j], memo[i+1][i+sec-1] + memo[i+sec][j]); } ofstream out("output.txt"); assert( out ); out << memo[0][n-1] << endl; out.close(); ric(0, n-1); return 0; }