这道题和上一篇chopsticks很相似。直接附上代码。
#include<iostream>
#include<algorithm>
using namespace std;
int cmp(int a,int b)
{
return a<b;
}
int min(int a,int b)
{
if(a<b)
return a;
else return b;
}
int good[2001];
int dp[1001][2001];
int main()
{
int n,k,i,begin,p;
while(cin>>n>>k)
{
for(i=1;i<=n;i++)
cin>>good[i];
sort(good+1,good+1+n,cmp);
dp[1][2]=(good[1]-good[2])*(good[1]-good[2]);
for(int j=3;j<=n;j++)
dp[1][j]=min(dp[1][j-1],(good[j-1]-good[j])*(good[j-1]-good[j]));
for(int j=2;j<=k;j++)
{
begin=2*j;
dp[j][begin]=dp[j-1][begin-2]+(good[begin-1]-good[begin])*(good[begin-1]-good[begin]);
for(p=begin+1;p<=n;p++)
dp[j][p]=min(dp[j][p-1],dp[j-1][p-2]+(good[p-1]-good[p])*(good[p-1]-good[p]));
}
cout<<dp[k][n]<<endl;
}
return 0;
}