2 1 1 3
4
#include<iostream> #include<algorithm> using namespace std; int main() { int n,k,i,j,m,p; __int64 s[2002],dp[2002][1001],w[2002]; while(scanf("%d%d",&n,&k)!=EOF) { s[0]=0; for(i=1;i<=n;i++) scanf("%I64d",&s[i]); sort(s+1,s+n+1); for(i=1;i<=n;i++) w[i]=(s[i]-s[i-1])*(s[i]-s[i-1]); memset(dp,0,sizeof(dp)); for(i=0;i<2002;i++) for(j=1;j<=k;j++) dp[i][j]=INT_MAX; for(i=2;i<=n;i++) for(j=1;j<=k;j++) { if(dp[i-1][j]<dp[i-2][j-1]+w[i]) dp[i][j]=dp[i-1][j]; else dp[i][j]=dp[i-2][j-1]+w[i]; } printf("%I64d\n",dp[n][k]); } return 0; }
原文:http://blog.csdn.net/yuhaojia/article/details/23621797