#include <bits/stdc++.h>
using namespace std;
const int maxn = 35e3 + 5, maxk = 55;
int l[maxn], tmp[maxn], dp[maxk][maxn], sg[maxk][4 * maxn],
    lazy[maxk][4 * maxn], n, cnt, k;
bool c[maxn];
void shift(int id, int andis) {
  lazy[andis][id * 2] += lazy[andis][id];
  lazy[andis][id * 2 + 1] += lazy[andis][id];
  sg[andis][id * 2] += lazy[andis][id];
  sg[andis][id * 2 + 1] += lazy[andis][id];
  lazy[andis][id] = 0;
}
void update(int l, int r, int ql, int qr, int qval, int id, int andis) {
  if (ql > qr) return;
  if (l >= ql && r <= qr) {
    lazy[andis][id] += qval;
    sg[andis][id] += qval;
  } else if (l > qr || r < ql)
    return;
  else {
    shift(id, andis);
    int mid = (l + r) / 2;
    update(l, mid, ql, qr, qval, id * 2, andis);
    update(mid + 1, r, ql, qr, qval, id * 2 + 1, andis);
    sg[andis][id] = max(sg[andis][id * 2], sg[andis][id * 2 + 1]);
  }
}
int get(int l, int r, int ql, int qr, int id, int andis) {
  if (l >= ql && r <= qr)
    return sg[andis][id];
  else if (l > qr || r < ql)
    return 0;
  else {
    shift(id, andis);
    int mid = (r + l) / 2;
    return max(get(l, mid, ql, qr, id * 2, andis),
               get(mid + 1, r, ql, qr, id * 2 + 1, andis));
  }
}
int main() {
  scanf("%d %d", &n, &k);
  for (int i = 1, a; i <= n; i++) {
    scanf("%d", &a);
    l[i] = tmp[a];
    tmp[a] = i;
    if (!c[a]) {
      cnt++;
      c[a] = 1;
    }
    dp[1][i] = cnt;
    update(1, n, i, i, cnt, 1, 1);
  }
  for (int i = 2; i <= k; i++)
    for (int j = 1; j <= n; j++) {
      update(1, n, max({1, l[j], i - 1}), j - 1, 1, 1, i - 1);
      dp[i][j] = get(1, n, i - 1, j, 1, i - 1);
      update(1, n, j, j, dp[i][j], 1, i);
    }
  printf("%d \n", dp[k][n]);
}
