hdu-1421(dp)

解题思路: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;
 }

  

posted @ 2018-03-14 22:14  荒岛的龟  阅读(103)  评论(0编辑  收藏  举报