我跟书上写的不一样,但是我的可以过,好理解。。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
//注意!list从下标为1开始list[j]表示第j件物体
int list[2005];
int dp[1005][2005];
bool cmp(int a,int b)
{
return a<b;
}
int min(int a,int b)
{
return a<b?a:b;
}
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&list[i]);
}
sort(list+1,list+1+n,cmp);
for(int i=0;i<=n;i++)dp[0][i]=0;
//dp[i][j]
for(int i=1;i<=k;i++)
{
for(int j=2*i;j<=n;j++)
{
if(j==2*i)//第j个物品必须与第j-1个物品配对
{
dp[i][j]=dp[i-1][j-2]+(list[j]-list[j-1])*(list[j]-list[j-1]);
}
else//第j个物品不一定要与第j-1个物品配对
{
dp[i][j]=min(dp[i][j-1],dp[i-1][j-2]+(list[j]-list[j-1])*(list[j]-list[j-1]));
}
}
}
printf("%d\n",dp[k][n]);
}
return 0;
}