Codeforces Round #156 (Div. 1) A dp
// Enter a number for each number,
// Dp [I] [j] indicates the number of I, first of which is the largest sequence obtained by the number of j.
// Dp [I] [j] = dp [I] [j] = dp [last [j] [map [num [I] + 1;
// Last [j] is the final position of the number j.
// Map [num [I] the number of I
# Include
# Include
# Include
Using namespace std;
Const int maxn = 4010;
Const int maxm = 1000010;
Int map [maxm];
Int last [maxn];
Int dp [maxn] [maxn];
Int num [maxn];
Int main ()
{
Int n;
While (~ Scanf ("% d", & n ))
{
For (int I = 1; I <= n; I ++)
Scanf ("% d", & num [I]);
Int len = 1;
Memset (map, 0, sizeof (map ));
For (int I = 1; I <= n; I ++)
If (! Map [num [I])
Map [num [I] = len ++;
Memset (dp, 0, sizeof (dp ));
Int ans = 1;
Last [map [num [1] = 1;
For (int I = 1; I <= len; I ++)
Dp [1] [I] = 1;
For (int I = 2; I <= n; I ++)
{
For (int j = 1; j <len; j ++)
{
Dp [I] [j] = dp [last [j] [map [num [I] + 1;
Ans = max (dp [I] [j], ans );
}
Last [map [num [I] = I;
}
Printf ("% d \ n", ans );
}
}