#include <bits/stdc++.h>
#define MAXN 1005
using namespace std;
unsigned long long dis[MAXN][MAXN],w[MAXN],sum[MAXN];
int num[MAXN];
#define FZ(i,p)(dis[i-1][p]-w[p]+sum[p]*sum[p])
int i,p;
bool checkup(int i,int p1,int p2,int p3)
{
int x1=sum[p1], x2=sum[p2], x3=sum[p3], y1=FZ(i,p1), y2=FZ(i,p2), y3=FZ(i,p3);
if((y2-y3)*(x1-x2)<(y1-y2)*(x2-x3)) return 1;
else return 0;
}
int que[MAXN],tail,head;
int n,m,j;
int main(){
while(~scanf("%d%d",&n,&m)&&(n||m))
{
memset(sum,0,sizeof (sum));
memset(w,0,sizeof (w));
for(i=1;i<=n;i++)
{
scanf("%d",&num[i]);
sum[i]=sum[i-1]+num[i];
w[i]=w[i-1]+num[i]*sum[i-1];
}
for(i=1;i<=n;i++)
dis[1][i]=w[i];
for(i=2;i<=m+1;i++)
{
tail=head=1;
que[tail++]=0;//
for(j=1;j<=n;j++)
{
while(tail-1>head&&FZ(i,que[head+1])-FZ(i,que[head])<(sum[que[head+1]]-sum[que[head]])*sum[j])
head++;
int k=que[head];
dis[i][j]=dis[i-1][k]+w[j]-w[k]+sum[k]*(sum[j]-sum[k]);
while(tail-1>head&&checkup(i,j,que[tail-1],que[tail-2])==0)
tail--;
que[tail++]=j;
}
}printf("%I64d\n",dis[m+1][n]);
}
}