#include <bits/stdc++.h>
using namespace std;
template <typename T>
void cmax(T& a, T b) {
  a = max(a, b);
}
template <typename T>
void cmin(T& a, T b) {
  a = min(a, b);
}
void _BG(const char* s) {}
template <typename T, typename... TT>
void _BG(const char* s, T a, TT... b) {
  for (int c = 0; *s && (c || *s != ','); ++s) {
    cerr << *s;
    switch (*s) {
      case '(':
      case '[':
      case '{':
        ++c;
        break;
      case ')':
      case ']':
      case '}':
        --c;
        break;
    }
  }
  cerr << " = " << a;
  if (*s) {
    cerr << ", ";
    _BG(++s, b...);
  } else
    cerr << endl;
}
bool RD(void) { return true; }
bool RD(char& a) { return scanf(" %c", &a) == 1; }
bool RD(char* a) { return scanf("%s", a) == 1; }
bool RD(double& a) { return scanf("%lf", &a) == 1; }
bool RD(int& a) { return scanf("%d", &a) == 1; }
bool RD(long long& a) { return scanf("%lld", &a) == 1; }
template <typename T, typename... TT>
bool RD(T& a, TT&... b) {
  return RD(a) && RD(b...);
}
void PT(const char a) { putchar(a); }
void PT(const char* a) { fputs(a, stdout); }
void PT(char* a) { fputs(a, stdout); }
void PT(const double a) { printf("%.16f", a); }
void PT(const int a) { printf("%d", a); }
void PT(const long long a) { printf("%lld", a); }
template <char sep = ' ', char end = '\n'>
void PL(void) {
  if (end) PT(end);
}
template <char sep = ' ', char end = '\n', typename T, typename... TT>
void PL(const T a, const TT... b) {
  PT(a);
  if (sizeof...(b) && sep) PT(sep);
  PL<sep, end>(b...);
}
const int N = 35000 + 87, inf = 1e9;
int la[N], pr[N], dp[2][N];
struct node {
  int mx, tg;
} t[N * 4];
void pull(int o) { t[o].mx = max(t[o << 1].mx, t[o << 1 | 1].mx); }
void bld(int o, int l, int r, int v[]) {
  t[o].tg = 0;
  if (r - l == 1) {
    t[o].mx = v[l];
    return;
  }
  int m = l + ((r - l) >> 1);
  bld(o << 1, l, m, v);
  bld(o << 1 | 1, m, r, v);
  pull(o);
}
void add(int o, int v) {
  t[o].mx += v;
  t[o].tg += v;
}
void push(int o) {
  if (t[o].tg) {
    add(o << 1, t[o].tg);
    add(o << 1 | 1, t[o].tg);
    t[o].tg = 0;
  }
}
void add(int o, int l, int r, int i, int j, int v) {
  if (r <= i || j <= l) return;
  if (i <= l && r <= j) {
    add(o, v);
    return;
  }
  int m = (l + r) / 2;
  push(o);
  add(o << 1, l, m, i, j, v);
  add(o << 1 | 1, m, r, i, j, v);
  pull(o);
}
int qry(int o, int l, int r, int i, int j) {
  if (r <= i || j <= l) return -inf;
  if (i <= l && r <= j) return t[o].mx;
  int m = (l + r) / 2;
  push(o);
  return max(qry(o << 1, l, m, i, j), qry(o << 1 | 1, m, r, i, j));
}
int main() {
  int n;
  RD(n);
  int k;
  RD(k);
  for (int i(1), _B((n) + 1); i < _B; ++i) {
    int a;
    RD(a);
    pr[i] = la[a];
    la[a] = i;
  }
  for (int i(1), _B((n) + 1); i < _B; ++i) dp[1][i] = dp[1][i - 1] + !pr[i];
  for (int i(2), _B((k) + 1); i < _B; ++i) {
    int b = i & 1;
    bld(1, 1, n + 1, dp[b ^ 1]);
    fill_n(dp[b] + 1, i - 1, -inf);
    for (int j(i), _B((n) + 1); j < _B; ++j) {
      add(1, 1, n + 1, max(pr[j], 1), j, 1);
      dp[b][j] = qry(1, 1, n + 1, i - 1, j);
    }
  }
  PL(dp[k & 1][n]);
}
