#include <bits/stdc++.h>
using namespace std;
#define maxn 1111longlong dp[maxn][maxn];
int n, m, que[maxn];
longlong a[maxn], sum[maxn], cost[maxn];
longlong up (int i, int j, int k) {
return dp[i][k]-cost[i]+sum[i]*sum[i] - (dp[j][k]-cost[j]+sum[j]*sum[j]);
}
longlong down (int i, int j, int k) {
returnsum[i]-sum[j];
}
int main () {
while (scanf ("%d%d", &n, &m) == 2 && n+m) {
sum[0] = 0;
for (int i = 1; i <= n; i++) scanf ("%lld", &a[i]), sum[i] = sum[i-1]+a[i];
cost[1] = 0;
for (int i = 2; i <= n; i++) cost[i] = cost[i-1]+sum[i-1]*a[i];
for (int i = 1; i <= n; i++) dp[i][0] = cost[i];
for (int k = 1; k <= m; k++) {
int L = 0, R = 0;
que[R++] = 0;
for (int i = 1; i <= n; i++) {
while (L+1 < R && up (que[L+1], que[L], k-1) <= sum[i]*down (que[L+1], que[L], k-1))
L++;
int j = que[L];
dp[i][k] = dp[j][k-1] + cost[i] - cost[j] - sum[j]*(sum[i]-sum[j]);
while (L+1 < R && up (i, que[R-1], k-1)*down (que[R-1], que[R-2], k-1) <=
up (que[R-1], que[R-2], k-1)*down (i, que[R-1], k-1))
R--;
que[R++] = i;
}
}
printf ("%lld\n", dp[n][m]);
}
return0;
}