/* FILE: collage-ric.cpp last change: 8-Sept-2012 Romeo Rizzi * recursive solver for problem "collage" in 28-09-2012 exam in Algorithms */ #define NDEBUG // NDEBUG definita nella versione che consegno #include #ifndef NDEBUG # include // uso di cin e cout non consentito in versione finale #endif #include #include const int MAX_N = 1000; int rainbow[MAX_N]; int n; int memo[MAX_N][MAX_N]; const int UNKNOWN = -1; //const int DROP = -1; //const int LOOK = -2; using namespace std; int opt(int i, int j) { if (i>j) return 0; if (memo[i][j] == UNKNOWN) { memo[i][j] = 1 + opt(i+1, j); for (int sec = 1; i + sec <= j; ++sec) { if (rainbow[i+sec] == rainbow[i]) { memo[i][j] = min(memo[i][j], opt(i+1, i+sec-1) + opt(i+sec, j)); // memo[i][j] = min(memo[i][j], opt(i, i+sec) + opt(i+sec, j) -1 ); } } } return memo[i][j]; } int main (int argc, char** argv) { ifstream in("input.txt"); assert(in); in >> n; for (int i = 0; i < n; ++i) { in >> rainbow[i]; } in.close(); //for (int i = 0; i < n; ++i) // cout << rainbow[i] << " "; //cout << endl; for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) memo[i][j] = UNKNOWN; ofstream out("output.txt"); assert(out); out << opt(0, n-1) << endl; out.close(); return 0; }