#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]); } }