#include <bits/stdc++.h>
using namespace std;
const int maxN = 35000 + 10;
const int maxK = 50 + 10;
int n, k;
int a[maxN];
int d[maxK][maxN];
int seg[4 * maxN];
int last[maxN], good[maxN];
void shift(int x, int s, int e) {
  int diff = seg[x] - max(seg[2 * x], seg[2 * x + 1]);
  if (max(seg[2 * x], seg[2 * x + 1]) != seg[x])
    seg[2 * x] += diff, seg[2 * x + 1] += diff;
}
void add(int l, int r, int v, int x = 1, int s = 0, int e = n) {
  if (r <= s || e <= l) return;
  if (l <= s && e <= r) {
    seg[x] += v;
    return;
  }
  shift(x, s, e);
  int m = (s + e) / 2;
  add(l, r, v, 2 * x, s, m);
  add(l, r, v, 2 * x + 1, m, e);
  seg[x] = max(seg[2 * x], seg[2 * x + 1]);
}
int get_max(int l, int r, int x = 1, int s = 0, int e = n) {
  if (r <= s || e <= l) return 0;
  if (l <= s && e <= r) return seg[x];
  shift(x, s, e);
  int m = (s + e) / 2;
  return max(get_max(l, r, 2 * x, s, m), get_max(l, r, 2 * x + 1, m, e));
}
int main() {
  cin >> n >> k;
  for (int i = 0; i < n; i++) cin >> a[i];
  memset(last, -1, sizeof last);
  for (int i = 0; i <= n; i++) {
    d[0][i] = get_max(0, i);
    if (i < n) {
      if (last[a[i]] != -1) add(0, last[a[i]] + 1, -1);
      add(0, i + 1, 1);
      last[a[i]] = i;
    }
  }
  for (int l = 1; l < k; l++) {
    memset(seg, 0, sizeof seg);
    for (int i = 1; i <= n; i++) add(i, n, d[l - 1][i] - d[l - 1][i - 1]);
    memset(last, -1, sizeof last);
    for (int i = 0; i <= n; i++) {
      d[l][i] = get_max(0, i);
      if (i < n) {
        if (last[a[i]] != -1) add(0, last[a[i]] + 1, -1);
        add(0, i + 1, 1);
        last[a[i]] = i;
      }
    }
  }
  cout << d[k - 1][n] << endl;
  return 0;
}
