/*典型的序列性DP,f[i][j]记录前i匹马,分到j个马棚里的最小不愉快系数,p[i][j]储存着i到j这个区间的马在一个马棚里的不愉快系数,house[i]储存着到地i匹马总共有多少匹白马,多少匹黑马*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
#define N 501
int f[N][N],p[N][N];
struct House{
int a;int b;
};
House house[N];
int n,k;
void input()
{
scanf("%d%d",&n,&k);
int x;
for(int i=1;i<=n;++i)
{
scanf("%d",&x);
house[i].a=house[i-1].a;
house[i].b=house[i-1].b;
if(x==0) house[i].a++;
if(x==1) house[i].b++;
}
for(int i=1;i<=n-1;++i)/*对于p数组的预处理特别重要*/
for(int j=i+1;j<=n;++j)
{
int r1=abs(house[i-1].a-house[j].a);
int r2=abs(house[i-1].b-house[j].b);
p[i][j]=r1*r2;
}
memset(f,99,sizeof(f));
for(int i=1;i<=n;++i)
f[i][1]=p[1][i];/*DP方程的边界,前i个马在一个马棚的不愉快系数*/
}
void dp()
{
for(int j=2;j<=k;++j)
for(int i=j;i<=n;++i)
for(int t=j-1;t<=i-1;++t)
f[i][j]=min(f[i][j],f[t][j-1]+p[t+1][i]);/*DP方程前i匹马,分到j个马棚里的最小不愉快系数,就是把j-1<=t<=i-1匹马放到j-1个马棚中,其余t+1到i匹马在一个马棚中的不愉快系数最小值*/
}
int main()
{
input();
dp();
cout<<f[n][k]<<endl;
return 0;
}