#include<iostream> #include<algorithm> using namespace std; /* 先对n中物品的重量排序 令dp[i][j]表示前i个物品中选j对的最小疲劳度。 则dp[i][j]可能含有第i个物品(这种情况下,第i种物品一定是和第i-1个物品配对), 则dp[i][j]=dp[i-2][j-1]+(w[i]-w[i-1])*(w[i]-w[i-1]) dp[i][j]的j对也可能不含有第i个物品,此时有 dp[i][j]=dp[i-1][j] 状态转移方程 dp[i][j]=min{dp[i-2][j-1]+(w[i]-w[i-1])*(w[i]-w[i-1]),dp[i-1][j]} */ #define pow2(a,b) ((a)-(b))*((a)-(b)) #define MIN(a,b) (a)<(b)?(a):(b) #define M 2001 int elems[M],dp[M][M/2]; int main(){ int n,k; dp[0][0]=0; while(cin>>n>>k){ int i,j; for(i=1;i<=n;i++) cin>>elems[i],fill_n(dp[i],n,INT_MAX),dp[i][0]=0; sort(elems+1,elems+n+1); for(i=2;i<=n;i++) for(j=1; j*2<=i; j++) dp[i][j]=MIN(dp[i-1][j],dp[i-2][j-1]+pow2(elems[i],elems[i-1])); cout<<dp[n][k]<<endl; } return 0; }