zoukankan      html  css  js  c++  java
  • HDU1421

    /*
    a<b<c<d
    容易证明:(a-b)^2+(c-d)^2 < (a-c)^2+(b-d)^2
    即此题可以先排序,然后相邻的两个平方差最小
    
    dp[i][j]表示i件物品选取j对 的最小疲劳度,w[i]表示第i件物品的重量
    方程为:
        i==j*2
            dp[i][j] = dp[i-2][j-1]+(w[i]-w[i-1])*(w[i]-w[i-1]);
        i>j*2
            dp[i][j] = min(dp[i-1][j],dp[i-2][j-1]+(w[i]-w[i-1])*(w[i]-w[i-1]));
    
    2 1
    1 3
    
    
    4
    */
    #include <cstdio>
    #include <cstdlib>
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    int dp[2005][1005];
     int w[2005];
    using namespace std;
    int main()
    {
        int n,k;
        while(scanf("%d %d",&n,&k)!=EOF)
        {
            for(int i=1;i<=n;i++)
                scanf("%d",&w[i]);
            w[0] = 0;
            sort(w+1,w+n+1);
            for(int i=0;i<2005;i++)
            {
                 dp[i][0] = 0;
            }
            for(int j=0;j<1005;j++)
            {
                dp[0][j] = 0;
                dp[1][j] = 0;
            }
            for(int i=2;i<=n;i++)
                for(int j=1;2*j<=i;j++)
            {
               if(i==j*2)
                    dp[i][j] = dp[i-2][j-1]+(w[i]-w[i-1])*(w[i]-w[i-1]);
                else if(i>j*2)
                    dp[i][j] = min(dp[i-1][j],dp[i-2][j-1]+(w[i]-w[i-1])*(w[i]-w[i-1]));
            }
            printf("%d\n",dp[n][k]);
        }
    }
  • 相关阅读:
    LeetCode题解——两数之和
    题解LeetCode——回文数
    汇编语言入门教程
    python基础--局部变量与全局变量
    linux--基础知识1
    python基础--函数
    字符串format函数使用
    字符串的拼接
    python基础--6 集合
    python基础--5字典
  • 原文地址:https://www.cnblogs.com/xibaohe/p/3017000.html
Copyright © 2011-2022 走看看