#include <bits/stdc++.h>
using namespace std;
struct node {
  int l, r, sum, lazy;
} tr[140010];
int dp[60][40000], pre[35010], pos[35010];
void init() { memset(tr, 0, sizeof(tr)); }
void push_up(int root) {
  tr[root].sum = max(tr[root << 1].sum, tr[root << 1 | 1].sum);
}
void push_down(int root) {
  tr[root << 1].sum += tr[root].lazy;
  tr[root << 1].lazy += tr[root].lazy;
  tr[root << 1 | 1].sum += tr[root].lazy;
  tr[root << 1 | 1].lazy += tr[root].lazy;
  tr[root].lazy = 0;
}
void build(int root, int l, int r, int now) {
  if (l == r) {
    tr[root].l = l;
    tr[root].r = r;
    tr[root].sum = dp[now][l - 1];
    return;
  }
  tr[root].l = l;
  tr[root].r = r;
  int mid = (l + r) >> 1;
  build(root << 1, l, mid, now);
  build(root << 1 | 1, mid + 1, r, now);
  push_up(root);
}
void update(int root, int l, int r, int val) {
  if (tr[root].l == l && tr[root].r == r) {
    tr[root].sum += val;
    tr[root].lazy += val;
    return;
  }
  if (tr[root].lazy) {
    push_down(root);
  }
  int mid = (tr[root].l + tr[root].r) >> 1;
  if (mid < l) {
    update(root << 1 | 1, l, r, val);
  } else {
    if (mid >= r) {
      update(root << 1, l, r, val);
    } else {
      update(root << 1, l, mid, val);
      update(root << 1 | 1, mid + 1, r, val);
    }
  }
  push_up(root);
}
int query(int root, int l, int r) {
  if (tr[root].l == l && tr[root].r == r) {
    return tr[root].sum;
  }
  if (tr[root].lazy) {
    push_down(root);
  }
  int mid = (tr[root].l + tr[root].r) >> 1;
  if (mid < l) {
    return query(root << 1 | 1, l, r);
  } else {
    if (mid >= r) {
      return query(root << 1, l, r);
    } else {
      return max(query(root << 1, l, mid), query(root << 1 | 1, mid + 1, r));
    }
  }
}
int main() {
  int n, k, t;
  scanf("%d%d", &n, &k);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &t);
    pre[i] = pos[t] + 1;
    pos[t] = i;
  }
  for (int i = 1; i <= k; i++) {
    init();
    build(1, 1, n, i - 1);
    for (int j = 1; j <= n; j++) {
      update(1, pre[j], j, 1);
      dp[i][j] = query(1, 1, j);
    }
  }
  printf("%d\n", dp[k][n]);
}
