#include <iostream>
#include <cmath>
#include <string.h>
#include <stdio.h>
#include <map>
#include <algorithm>
using namespace std;
long long dp[1009],sum[1009],a[1009];
int main ()
{
int t;
scanf("%d",&t);
int n,m;
while(t--)
{
scanf("%d%d",&n,&m);
sum[0]=0;
dp[0]=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];
dp[i]=sum[i]*sum[i];
}
for(int i=2;i<=m;i++)
{
for(int j=n-m+i;j>=i;j--)//n-m+i后面的不用更新,因为前面的划分为i块,最后几个一个一块
{
for(int k=1;k<j;k++)
{
dp[j]=min(dp[j],dp[k]+((sum[j]-sum[k])*(sum[j]-sum[k])));
}
if(i==m)break;
}
}
cout<<dp[n]<<endl;
}
return 0;
}
山东省第二届ACM大学生程序设计竞赛 Sequence
最新推荐文章于 2019-05-14 10:42:05 发布