hdu-1421(dp)

时间:2021-05-08 02:15:51

解题思路:dp[i][j]表示前i个物品中取k对所要的最小花费;

首先得对物品进行处理,因为需要当前物品减前一个物品的平方和最小;

所以先排序,因为排序的相邻两个的差的平方一定最小;

然后转移方程:dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+w);

 #include<iostream>
#include<algorithm>
#include<math.h>
#define maxn 2005
#define inf 2147483646
using namespace std;
int dp[maxn][1005];int n,k;
//dp[i][j]表示前n个物品取k对的值;
int w[maxn];
int main()
{dp[0][0]=0;
w[0]=0;
while(cin>>n>>k)
{
for(int i=1;i<=n;i++)
cin>>w[i];
sort(w+1,w+1+n);
for(int i=0;i<=n;i++)
for(int j=1;j<=k;j++)
dp[i][j]=inf;
for(int i=2;i<=n;i++)
{
for(int j=1;2*j<=i;j++)
{
dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(w[i]-w[i-1])*(w[i]-w[i-1]));
}
}
cout<<dp[n][k]<<endl;
}
return 0;
}