#include #include #include #include #include using namespace std; //numero di triplette max #define MAX_N 1001 //sol[a][b] , a<=b, e las ol del sottoprob. [a...b] int sol[MAX_N][MAX_N]; int n; int arco[MAX_N]; void scan(void) { ifstream in("input.txt"); in >> n; for(int i = 0; i < n; i++) in >> arco[i]; } //rest. la sol. minima del sottoprob. [a...b] int solve(int a,int b) { //cerco la casella + a dx con colore arco[b]. int dx = b - 1; for(; dx >= a; dx--) if(arco[dx] == arco[b]) break; //il col. a pos b non e mai stato messo cout << a << " " << "dx:" << dx << " " << b << endl; if(dx < a) return sol[a][b-1] + 1; //provo a connettere b con dx. se disturba qualcuno, non lo faccio //guardo se ho gia risp. a sx di dx. int sx = dx-1; for(;sx >= a; sx--) if(arco[sx] == arco[dx]) break; cout << a << " " << "sx:" << sx << " " << b << endl; //se esiste sx e se a sin. ho risp. usando sx, non disturbo nessuno!!! if(sx >= a && sol[a][dx-1] == sol[a][dx]) return sol[a][b-1]; if(sol[a][dx-1] + 1 + sol[dx+1][b-1] > sol[a][b-1]) return sol[a][b-1] + 1; return sol[a][b-1]; } int main(void) { scan(); //init delle sol. for(int i = 0; i < n; i++) sol[i][i] = 1; for(int dist = 1; dist < n; dist++) for(int start = 0; start + dist < n; start++) cout << (sol[start][start+dist] = solve(start, start+dist)) << endl;; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) cout << sol[i][j] << " "; cout << endl; } cout << sol[0][n-1] << endl; return 0; }