#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=35005;
const int K=55;
int ls(int x){return x<<1;}
int rs(int x){return x*2+1;}
int n,k;
int a[N];
int in[N],s[N];
int tree[N],tag[N];
int dp[N][K];
void build(int p,int s,int t,int lst)
{
if(s==t)
{
tree[p]=dp[s][lst];
return;
}
int mid=s+((t-s)>>1);
build(ls(p),s,mid,lst);
build(rs(p),mid+1,t,lst);
tree[p]=max(tree[ls(p)],tree[rs(p)]);
}
void push_down(int p)
{
if(tag[p])
{
tree[ls(p)]+=tag[p];
tree[rs(p)]+=tag[p];
tag[ls(p)]+=tag[p];
tag[rs(p)]+=tag[p];
tag[p]=0;
}
return;
}
void update(int l,int r,int k,int s,int t,int p)
{
if(l<=s and t<=r)
{
tree[p]+=k;
tag[p]+=k;
return;
}
int mid=s+((t-s)>>1);
push_down(p);
if(l<=mid) update(l,r,k,s,mid,ls(p));
if(mid+1<=r) update(l,r,k,mid+1,t,rs(p));
tree[p]=max(tree[ls(p)],tree[rs(p)]);
}
int query(int l,int r,int s,int t,int p)
{
if(l<=s and t<=r) return tree[p];
int mid=s+((t-s)>>1);
push_down(p);
int maxn=-1;
if(l<=mid) maxn=max(maxn,query(l,r,s,mid,ls(p)));
if(mid+1<=r) maxn=max(maxn,query(l,r,mid+1,t,rs(p)));
return maxn;
}
signed main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
in[i]=s[a[i]]+1;
s[a[i]]=i;
// cout<<in[i]<<' ';
}
for(int i=1;i<=k;i++)
{
memset(tag,0,sizeof tag);
build(1,1,n,i-1);
for(int j=i;j<=n;j++)
{
update(in[j],j,1,1,n,1);
dp[j][i]=query(1,j,1,n,1);
}
cout<<'\n';
}
cout<<dp[n][k]<<'\n';
return 0;
}