#include <bits/stdc++.h>
using namespace std;
int n, k, a[35005], dp[35005], last[35005];
struct Node {
  int w, tag;
} seg[8 * 35005];
inline void pull(int id) {
  seg[id].w = max(seg[id << 1].w, seg[id << 1 | 1].w);
}
inline void push(int id) {
  if (seg[id].tag == 0) return;
  seg[id << 1].w += seg[id].tag;
  seg[id << 1 | 1].w += seg[id].tag;
  seg[id << 1].tag += seg[id].tag;
  seg[id << 1 | 1].tag += seg[id].tag;
  seg[id].tag = 0;
}
void build(int l, int r, int id) {
  if (l == r) {
    seg[id].w = dp[l];
    seg[id].tag = 0;
    return;
  }
  build(l, (l + r) / 2, id << 1);
  build((l + r) / 2 + 1, r, id << 1 | 1);
  seg[id].tag = 0;
  pull(id);
}
void update(int l, int r, int ll, int rr, int k, int id) {
  if (l > rr || r < ll) return;
  push(id);
  if (l >= ll && r <= rr) {
    seg[id].w += k;
    seg[id].tag += k;
    return;
  }
  update(l, (l + r) / 2, ll, rr, k, id << 1);
  update((l + r) / 2 + 1, r, ll, rr, k, id << 1 | 1);
  pull(id);
}
int query(int l, int r, int ll, int rr, int id) {
  if (l > rr || r < ll) return -1;
  push(id);
  if (l >= ll && r <= rr) return seg[id].w;
  return max(query(l, (l + r) / 2, ll, rr, id << 1),
             query((l + r) / 2 + 1, r, ll, rr, id << 1 | 1));
}
int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cin >> n >> k;
  for (int i = 1; i <= n; i++) cin >> a[i];
  for (int i = 1; i <= k; i++) {
    build(0, n, 1);
    fill(dp, dp + n + 1, 0);
    fill(last, last + n + 1, 0);
    for (int j = i; j <= n; j++) {
      update(0, n, last[a[j]], j - 1, 1, 1);
      last[a[j]] = j;
      dp[j] = query(0, n, 0, j - 1, 1);
    }
  }
  cout << dp[n] << '\n';
  return 0;
}
