#include <bits/stdc++.h>
using namespace std;
const int INF = 1000000000;
const int MAXN = 35005;
const int MAXK = 55;
struct node {
  int add;
  int mx;
} t[4 * MAXN + 228];
int dp[MAXK][MAXN];
int is_last[MAXN];
void build(int i, int v, int tl, int tr) {
  if (tl > tr) return;
  if (tl == tr) {
    t[v].mx = dp[i][tl];
    t[v].add = 0;
    return;
  }
  int tm = (tl + tr) / 2;
  build(i, 2 * v, tl, tm);
  build(i, 2 * v + 1, tm + 1, tr);
  t[v].mx = max(t[2 * v].mx, t[2 * v + 1].mx);
  t[v].add = 0;
}
int get_max(int v, int tl, int tr, int l, int r) {
  if (tl > tr || l > r || l > tr || tl > r) return -INF;
  if (tl == l && tr == r) {
    return t[v].mx;
  }
  int tm = (tl + tr) / 2;
  return t[v].add + max(get_max(2 * v, tl, tm, l, min(r, tm)),
                        get_max(2 * v + 1, tm + 1, tr, max(l, tm + 1), r));
}
void seg_add(int v, int tl, int tr, int l, int r, int val) {
  if (tl > tr || l > r || l > tr || tl > r) return;
  if (tl == l && tr == r) {
    t[v].mx += val;
    t[v].add += val;
    return;
  }
  int tm = (tl + tr) / 2;
  seg_add(2 * v, tl, tm, l, min(r, tm), val);
  seg_add(2 * v + 1, tm + 1, tr, max(l, tm + 1), r, val);
  t[v].mx = max(t[2 * v].mx, t[2 * v + 1].mx) + t[v].add;
}
int v[35005];
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n, k;
  cin >> n >> k;
  for (int i = 0; i < n; i++) {
    cin >> v[i];
  }
  for (int i = 0; i < MAXN; i++) {
    dp[0][i] = -INF;
  }
  dp[0][0] = 0;
  for (int i = 1; i <= k; i++) {
    map<int, int> last_pos;
    build(i - 1, 1, 0, MAXN - 1);
    for (int j = 0; j < i; j++) {
      dp[i][j] = -INF;
      auto it = last_pos.find(v[j]);
      if (it != last_pos.end()) {
        is_last[it->second] = 0;
        seg_add(1, 0, MAXN - 1, 0, it->second, -1);
      }
      is_last[j] = 1;
      last_pos[v[j]] = j;
      seg_add(1, 0, MAXN - 1, 0, j, 1);
    }
    for (int j = i; j <= n; j++) {
      dp[i][j] = get_max(1, 0, MAXN - 1, 0, j - 1);
      auto it = last_pos.find(v[j]);
      if (it != last_pos.end()) {
        is_last[it->second] = 0;
        seg_add(1, 0, MAXN - 1, 0, it->second, -1);
      }
      is_last[j] = 1;
      last_pos[v[j]] = j;
      seg_add(1, 0, MAXN - 1, 0, j, 1);
    }
  }
  cout << dp[k][n];
}
