#include #define REP(A,B) for(int (A)=0;(A)<(B);(A)++) #define pb push_back using namespace std; int D[5555]; int dp[5555][5555]; int rm[5555][5555]; int solve(int l, int r) { // [l, r) if(l == r) { return 0; } int& ans = dp[l][r]; if(ans == -1) { ans = solve(l+1, r); // for(int m = l; m < r; m++) { int m = l; int Rx = rm[m][r]; if(Rx != -1 && Rx > l) { //printf("l=%d, r=%d, Rx=%d\n", l, r,Rx); ans = max(ans, 1+solve(l+1, Rx)); } // } } return ans; } int main() { int n,k; while(scanf("%d", &n) == 1) { REP(i, n) scanf("%d", D+i); REP(i, n+1) REP(j, n+1) { dp[i][j] = -1; rm[i][j] = -1; } for(int l = 0; l < n; l++) { int last = -1; for(int r = l+1; r <= n; r++) { if(r-1 >= 0 && r-1 >= l && D[r-1] == D[l]) rm[l][r] = last = r-1; else rm[l][r] = last; } } printf("%d\n", solve(0, n)); } return 0; }