当然,还可以加滚动数组优化。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<memory.h>
#include<cmath>
#include<algorithm>
using namespace std;
const long long inf=1000000000000000000;
long long p[2010],dp[2010][2010];
int main()
{
int n,K,i,j;
while(~scanf("%d%d",&n,&K)){
for(i=1;i<=n;i++)
scanf("%lld",&p[i]);
for(i=0;i<=n;i++) dp[i][0]=0;
sort(p+1,p+n+1);
for(i=1;i<=n;i++)
for(j=1;j<=i;j++) dp[i][j]=inf;
for(i=1;i<=n;i++){
for(j=1;j<=i;j++){
if(i-1>=j) dp[i][j]=min(dp[i][j],dp[i-1][j]);
if(j>=2) dp[i][j]=min(dp[i][j],(dp[i-2][j-2]+(p[i-1]-p[i])*(p[i-1]-p[i])));
}
}
printf("%lld
",dp[n][2*K]);
}
return 0;
}