题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1500
#include<stdio.h>
#include<iostream>
using namespace std;
int dp[5001][1001],s[5005];
int area(int t){return t*t;}
int main()
{
int i,j,Case,k,n;
scanf("%d",&Case);
while(Case--)
{
scanf("%d%d",&k,&n);
for(i=n;i>=1;i--)
scanf("%d",&s[i]);
k+=8;
//只是这题排序一定要从大到小排序。(若为从小到大排序,
//dp[3*j][j]不能由dp[3*j-2][j-1]转移来,因为新增的筷子因为目前最长
for(j=1;j<=k;j++)
{
i=j*3;//j代表第几双筷子,i代表是第几个
dp[i][j]=dp[i-2][j-1]+area(s[i]-s[i-1]);
for(i++;i<=n;i++)//往后更新是为了方便更新后面的最小值
dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+area(s[i]-s[i-1]));
}
printf("%d\n",dp[n][k]);
}
return 0;
}