• 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;
     }
    

      

  • 相关阅读:
    类特性:多态
    类特性:继承
    类,对象入门
    cf round599 CDE
    cf round#598 CDEF
    高精度小数BigDecimal+二分——java
    点分治
    java——IO(普通文件,二进制文件,压缩文件 )
    JCF——Map
    JCF——set
  • 原文地址:https://www.cnblogs.com/huangdao/p/8570502.html
Copyright © 2020-2023  润新知