#include <bits/stdc++.h>
using namespace std;
int n, k;
int a[35123];
map<int, set<int> > nex;
int dp[55][35123];
int t[1 << 17];
int l[1 << 17];
void add(int val, int od, int po, int beg = 1, int end = 1 << 16, int wh = 1) {
  if (od <= beg && end <= po) {
    t[wh] += val;
    l[wh] += val;
    return;
  }
  if (od > end || po < beg) {
    return;
  }
  t[2 * wh] += l[wh];
  t[2 * wh + 1] += l[wh];
  l[2 * wh] += l[wh];
  l[2 * wh + 1] += l[wh];
  l[wh] = 0;
  add(val, od, po, beg, beg + (end - beg) / 2, 2 * wh);
  add(val, od, po, beg + (end - beg) / 2 + 1, end, 2 * wh + 1);
  t[wh] = max(t[2 * wh], t[2 * wh + 1]);
}
int main() {
  scanf("%d%d", &n, &k);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    nex[a[i]].insert(i);
  }
  set<int> cur;
  for (int i = 1; i <= n; i++) {
    cur.insert(a[i]);
    dp[1][i] = cur.size();
  }
  for (int j = 2; j <= k; j++) {
    for (int i = 1; i < (1 << 17); i++) t[i] = l[i] = 0;
    add(dp[j - 1][j - 1] + 1, j - 1, j - 1);
    dp[j][j] = t[1];
    for (int i = j + 1; i <= n; i++) {
      add(dp[j - 1][i - 1], i - 1, i - 1);
      auto it = nex[a[i]].lower_bound(i);
      if (it == nex[a[i]].begin()) {
        add(1, j - 1, i - 1);
      } else {
        it--;
        add(1, max(*it, j - 1), i - 1);
      }
      dp[j][i] = t[1];
    }
  }
  printf("%d\n", dp[k][n]);
  return 0;
}
