#include <bits/stdc++.h>
using namespace std;
const int maxn = 100000 + 7;
int n, K, last[maxn], pre[maxn], a[maxn], F[maxn], T[maxn * 4], tag[maxn * 4];
void Build_Tree(int k, int l, int r) {
  if (l == r)
    T[k] = F[l];
  else {
    int mid = (l + r) >> 1;
    Build_Tree((k << 1), l, mid), Build_Tree((k << 1) | 1, mid + 1, r);
    T[k] = max(T[k << 1], T[(k << 1) | 1]), tag[k] = 0;
  }
}
void update(int k, int l, int r, int val) {
  T[k] += val;
  if (l < r) tag[k] += val;
}
void pushdown(int k, int l, int r) {
  int mid = (l + r) >> 1;
  if (l < r)
    update((k << 1), l, mid, tag[k]), update((k << 1) | 1, mid + 1, r, tag[k]);
  tag[k] = 0;
}
void add(int k, int l, int r, int x, int y, int val) {
  if ((x <= l) && (r <= y))
    update(k, l, r, val);
  else {
    if (tag[k]) pushdown(k, l, r);
    int mid = (l + r) >> 1;
    if (x <= mid) add((k << 1), l, mid, x, y, val);
    if (y > mid) add((k << 1) | 1, mid + 1, r, x, y, val);
    T[k] = max(T[k << 1], T[(k << 1) | 1]);
  }
}
int query(int k, int l, int r, int x, int y) {
  if ((x <= l) && (r <= y))
    return T[k];
  else {
    if (tag[k]) pushdown(k, l, r);
    int mid = (l + r) >> 1, ans = 0;
    if (x <= mid) ans = max(ans, query((k << 1), l, mid, x, y));
    if (y > mid) ans = max(ans, query((k << 1) | 1, mid + 1, r, x, y));
    T[k] = max(T[k << 1], T[(k << 1) | 1]);
    return ans;
  }
}
int main() {
  scanf("%d%d", &n, &K);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    pre[i] = last[a[i]], last[a[i]] = i;
  }
  for (int TT = 1; TT <= K; TT++) {
    F[0] = 0;
    for (int i = 1; i <= n; i++) {
      add(1, 0, n, pre[i], i - 1, 1);
      if (i < TT) {
        F[i] = 0;
        continue;
      }
      F[i] = query(1, 0, n, TT - 1, i - 1);
    }
    Build_Tree(1, 0, n);
  }
  printf("%d\n", F[n]);
  return 0;
}
