#include <bits/stdc++.h>
using namespace std;
const int MAX = 35000 + 5;
int st[4 * MAX], lazy[4 * MAX], arr[MAX], ansdkjnasjd[MAX], last[MAX];
int dp[55][MAX];
int n, k;
void push(int p, int l, int r) {
  if (lazy[p] != 0) {
    st[p] += lazy[p];
    if (l != r) {
      lazy[p * 2] += lazy[p];
      lazy[p * 2 + 1] += lazy[p];
    }
    lazy[p] = 0;
  }
}
void update(int p, int l, int r, int i, int j, int val) {
  push(p, l, r);
  if (i > r || l > j) {
    return;
  } else if (l >= i && j >= r) {
    st[p] += val;
    if (l != r) {
      lazy[p * 2] += val;
      lazy[p * 2 + 1] += val;
    }
    return;
  }
  int mid = (l + r) / 2;
  update(p * 2, l, mid, i, j, val);
  update(p * 2 + 1, mid + 1, r, i, j, val);
  st[p] = max(st[p * 2], st[p * 2 + 1]);
}
int query(int p, int l, int r, int i, int j) {
  push(p, l, r);
  if (i > r || l > j) {
    return 0;
  } else if (l >= i && j >= r) {
    return st[p];
  }
  int mid = (l + r) / 2;
  return max(query(p * 2, l, mid, i, j), query(p * 2 + 1, mid + 1, r, i, j));
}
int main() {
  memset(last, -1, sizeof last);
  scanf("%d %d", &n, &k);
  for (int i = int(1); i < int(n + 1); i++) {
    scanf("%d", arr + i);
    ansdkjnasjd[i] = last[arr[i]];
    last[arr[i]] = i;
  }
  set<int> all;
  for (int i = int(1); i < int(n + 1); i++) {
    all.insert(arr[i]);
    dp[1][i] = all.size();
    update(1, 1, n, i, i, dp[1][i]);
  }
  for (int i = int(2); i < int(k + 1); i++) {
    for (int j = int(1); j < int(i); j++) {
      int left = max(1, ansdkjnasjd[j]), right = j - 1;
      update(1, 1, n, left, right, 1);
    }
    for (int j = int(i); j < int(n + 1); j++) {
      int left = max(1, ansdkjnasjd[j]), right = j - 1;
      update(1, 1, n, left, right, 1);
      dp[i][j] = query(1, 1, n, 1, j - 1);
    }
    memset(st, 0, sizeof st);
    memset(lazy, 0, sizeof lazy);
    for (int j = int(1); j < int(n + 1); j++) {
      update(1, 1, n, j, j, dp[i][j]);
    }
  }
  printf("%d\n", dp[k][n]);
  return 0;
}
