#include <bits/stdc++.h>
using namespace std;
int const N = 35000 + 20, K = 50 + 5, inf = 1e9 + 20;
int n, k, a[N], last[N], dp[N][K];
struct node {
  int mx, lazy;
} seg[K][N << 2];
inline void pp(int S, int v, int val) {
  seg[S][v].mx += val;
  seg[S][v].lazy += val;
}
inline void shift(int S, int v) {
  int lc = v << 1, rc = lc | 1;
  pp(S, lc, seg[S][v].lazy);
  pp(S, rc, seg[S][v].lazy);
  seg[S][v].lazy = 0;
}
void add(int S, int l, int r, int val, int v = 1, int s = 0, int e = n + 1) {
  if (s >= r || e <= l) {
    return;
  }
  if (s >= l && e <= r) {
    pp(S, v, val);
    return;
  }
  shift(S, v);
  int mid = (s + e) >> 1, lc = v << 1, rc = lc | 1;
  add(S, l, r, val, lc, s, mid);
  add(S, l, r, val, rc, mid, e);
  seg[S][v].mx = max(seg[S][lc].mx, seg[S][rc].mx);
}
int get(int S, int l, int r, int v = 1, int s = 0, int e = n + 1) {
  if (s >= r || e <= l) {
    return 0;
  }
  if (s >= l && e <= r) {
    return seg[S][v].mx;
  }
  shift(S, v);
  int mid = (s + e) >> 1, lc = v << 1, rc = lc | 1;
  return max(get(S, l, r, lc, s, mid), get(S, l, r, rc, mid, e));
}
int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> k;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  add(0, 1, n + 1, -inf);
  for (int j = 1; j <= k; j++) {
    add(j, 0, 1, -inf);
  }
  memset(last, -1, sizeof last);
  for (int i = 0; i < n; i++) {
    for (int j = 1; j <= k; j++) {
      add(j - 1, last[a[i]] + 1, i + 1, 1);
      dp[i + 1][j] = max(get(j - 1, 0, i + 1), dp[i][j]);
      add(j, i + 1, i + 2, dp[i + 1][j]);
    }
    last[a[i]] = i;
  }
  cout << dp[n][k] << '\n';
}
