2 1 1 3
#include<algorithm>
#include<iostream>
using namespace std;
int min(int a,int b)
{
return a<b?a:b;
}
int square(int a)
{
return a*a;
}
int n,i,k,j,l,a[2005],b[2005][2005];//a[]数据,b[]滚动数组
int main()
{
while(cin>>n>>k)
{
for(i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+1+n);
b[0][0]=0;
for(i=1,j=2;i<=k;i++,j=2*i)//i表示几队,j表示多少物品
{
b[i][j]=b[i-1][j-2]+square(a[j]-a[j-1]);
for(l=j+1;l<=n;l++)
b[i][l]=min(b[i][l-1],b[i-1][l-2]+square(a[l]-a[l-1]));//细品看懂这个动规
}
cout<<b[k][n]<<endl;
}
return 0;
}
原文地址:http://blog.csdn.net/hanhai768/article/details/26950019