#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]; set S[5555]; int solve(int l, int r) { // [l, r) if(l == r) { return 0; } int& ans = dp[l][r]; if(ans == -1) { ans = 0; for(int m = l; m < r; m++) { auto it = S[D[m]].upper_bound(m); if(it != S[D[m]].end() && *it < r) { //printf("beru kachnu na m=%d, rightmost je %d [r=%d]\n", m, *it, r); int rightmost = *it; ans = max(ans, 1+solve(m+1, rightmost)); } } } 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; REP(i, n+1) S[i].clear(); REP(i, n) { S[D[i]].insert(i); } printf("%d\n", solve(0, n)); } return 0; }