#include #include #include int n; int a[256]; int A[256], B[256]; int next[256]; int last[256]; int memo[201][201][201]; int rec( int lo, int hi, int cnt ) { if( lo > hi ) return 0; int &ret = memo[lo][hi][cnt]; if( ret != -1 ) return ret; ret = (cnt+B[lo])*(cnt+B[lo]) + rec( lo+1, hi, 0 ); for( int i = next[lo]; i <= hi; i = next[i] ) ret = std::max( ret, rec( lo+1, i-1, 0 ) + rec( i, hi, cnt+B[lo] ) ); return ret; } int main( void ) { int T = 1; // scanf( "%d", &T ); for( int tt = 1; tt <= T; ++tt ) { scanf( "%d", &n ); int m = 0; for( int i = 0; i < n; ++i ) { scanf( "%d", &a[i] ); if( i == 0 || a[i] != a[i-1] ) { ++m; A[m-1] = a[i]; B[m-1] = 1; } else ++B[m-1]; } n = m; memset( last, 0x3F, sizeof last ); for( int i = n-1; i >= 0; --i ) { next[i] = last[A[i]]; last[A[i]] = i; } memset( memo, -1, sizeof memo ); printf( "%d\n", rec( 0, n-1, 0 ) ); } return 0; }