#include <bits/stdc++.h>
using namespace std;
struct Node {
  int sum, lazy;
} tree[55][4 * 35005];
int a[35005], nxt[35005] = {0};
void update_node(int idx, int b, int e, int v, int x) {
  tree[x][idx].sum += v;
  tree[x][idx].lazy += v;
}
void lazy_update(int idx, int b, int e, int x) {
  update_node((idx * 2), (b), ((b + e) / 2), tree[x][idx].lazy, x);
  update_node((idx * 2 + 1), ((b + e) / 2 + 1), (e), tree[x][idx].lazy, x);
  tree[x][idx].lazy = 0;
}
void update(int idx, int b, int e, int st, int en, int x, int v) {
  if (st > e || en < b) return;
  if (st <= b && en >= e) {
    update_node(idx, b, e, v, x);
    return;
  }
  if (tree[x][idx].lazy) lazy_update(idx, b, e, x);
  update((idx * 2), (b), ((b + e) / 2), st, en, x, v);
  update((idx * 2 + 1), ((b + e) / 2 + 1), (e), st, en, x, v);
  tree[x][idx].sum = max(tree[x][idx * 2].sum, tree[x][(idx * 2) + 1].sum);
  return;
}
int query(int idx, int b, int e, int st, int en, int x) {
  if (st > e || en < b) return 0;
  if (st <= b && en >= e) return tree[x][idx].sum;
  if (tree[x][idx].lazy) lazy_update(idx, b, e, x);
  int lft = query((idx * 2), (b), ((b + e) / 2), st, en, x);
  int rgt = query((idx * 2 + 1), ((b + e) / 2 + 1), (e), st, en, x);
  return max(lft, rgt);
}
int solve(int n, int k) {
  for (int i = n; i >= 1; i--) {
    for (int j = 0; j <= k; j++) {
      if (nxt[a[i]]) update(1, 1, n + 1, nxt[a[i]] + 1, n + 1, j, -1);
      update(1, 1, n + 1, i + 1, n + 1, j, 1);
    }
    nxt[a[i]] = i;
    for (int j = 1; j <= k; j++)
      update(1, 1, n + 1, i, i, j, query(1, 1, n + 1, i + 1, n + 1, j - 1));
  }
  return query(1, 1, n + 1, 1, 1, k);
}
int main() {
  std::ios_base::sync_with_stdio(0);
  int cases, caseno = 0, n, i, j, k, cnt, sum;
  cin >> n >> k;
  for (i = 1; i <= n; i++) cin >> a[i];
  memset(tree, 0, sizeof(tree));
  cout << solve(n, k) << '\n';
  return 0;
}
