https://ac.nowcoder.com/acm/problem/14117
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const int maxn=5e2+10;
const int mod=1e9+7;
ll dp[maxn][maxn],a[maxn]; //前i天做j题的最小难度
//区间dp,按天把题分割成m份,且m份的每一份中(Amax-Amin) 最小,所以先排序,
//新加入第l道题的时候,再加一重循环,遍历前状态中每道题,组成新的区间
//假设当下加入一道题,是放进前一天区间还是当天区间。
//前一天dp(i-1,l-1)+a(r)-a(l) 当天dp(i,r)
//实际上应该为当天和后一天。
//初始化:dp(1,1)=dp(1,1),dp(0,0)+0; 初始化dp(0,0)=0;
int main(){
int t,n,m;
cin>>t;
while(t--){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1);
memset(dp,inf,sizeof(dp));
dp[0][0]=0;
for(int i=1;i<=m;i++)
for(int l=1;l<=n;l++) //把l增加到r中
for(int r=l;r<=n;r++)
dp[i][r]=min(dp[i][r],dp[i-1][l-1]+(a[r]-a[l])*(a[r]-a[l]));
for(int i=1;i<=m;i++)
{
for(int l=1;l<=n;l++)
cout<<dp[i][l]<<" ";
cout<<endl;
}
}
}