#include #include using namespace std; unordered_map memory; vector ducks; int solve_interval(int from, int to) { int p = from + 20000 * to; if (!(from < to)) return 0; if (memory.count(p) > 0) return memory[p]; unordered_map right_most; for (int i = from; i < to; ++i) { right_most[ducks[i]] = i; } int current_right = 0; int best = -1; for (int i = from; i < to; ++i) { if (current_right < i) current_right = i; if (right_most[ducks[i]] <= current_right) continue; //cout << i << ' ' << ducks[i] << ' ' << right_most.count(ducks[i]) << endl; current_right = right_most[ducks[i]]; int sol = solve_interval(i+1, right_most[ducks[i]]); if (sol > best) best = sol; } memory[p] = best+1; return best+1; } int main() { int N, i, d; while (cin >> N) { memory.clear(); ducks.clear(); for (i = 0; i < N; ++i) { cin >> d; ducks.push_back(d); } cout << solve_interval(0, N) << '\n'; } }