显然需要排序。
对于第i个筷子,如果我们将它选入,那么必将和第i-1个筷子配对,这样平方差是最小的
dp[i][j]表示前i个筷子,已经选择了j个筷子的最小的代价
dp[i][j]=min(dp[i-1][j],dp[i-2][j-2]+sqr(a[i]-a[i-1]))
初始化条件
dp=maxint;
dp[0][0]=0;
注意j的枚举。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int f[110][110];
int a[110];
int main()
{
int n,k;
cin>>n>>k;
memset(f,63,sizeof(f));
k+=3;
if(k*2>n) {cout<<-1; return 0;}
for(int i=1;i<=n;i++) { cin>>a[i]; f[i][0]=0; }
f[0][0]=0;
sort(a+1,a+n+1);
for(int i=2;i<=n;i++)
for(int j=2;j<=min(i,k*2);j+=2)
{
f[i][j]=min(f[i-1][j],f[i-2][j-2]+(a[i]-a[i-1])*(a[i]-a[i-1]));
}
cout<<f[n][k*2];
return 0;
}