/* 状态转移方程式: dp[i][j]=Min(dp[i][j-1],dp[i-1][j-2]+(a[j-1]-a[j])*(a[j-1]-a[j])); 依次求出第i个人在第j个数时的所求的最小值 */ #include<stdio.h> #include<string.h> #define N 5100 int dp[1100][N]; int a[N]; int Min(int v,int vv) { return v>vv?vv:v; } int main() { int t,k,n,i,j; scanf("%d",&t); while(t--) { scanf("%d%d",&k,&n); k+=8; for(i=n;i>=1;i--)//排成非递增数列 scanf("%d",&a[i]); memset(dp,0,sizeof(dp)); for(i=1;i<=k;i++) { dp[i][i*3]=dp[i-1][i*3-2]+(a[i*3-1]-a[i*3])*(a[i*3-1]-a[i*3]);//初始化 for(j=i*3+1;j<=n;j++)//i*3是边界 dp[i][j]=Min(dp[i][j-1],dp[i-1][j-2]+(a[j-1]-a[j])*(a[j-1]-a[j])); } printf("%d ",dp[k][n]); } return 0; }