zoukankan      html  css  js  c++  java
  • HDU 1421 搬寝室 (DP)

    搬寝室

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 17065    Accepted Submission(s): 5785


    Problem Description
    搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆,因为n是一个小于2000的整数,实在是太多了,于是xhd决定随便搬2*k件过去就行了.但还是会很累,因为2*k也不小是一个不大于n的整数.幸运的是xhd根据多年的搬东西的经验发现每搬一次的疲劳度是和左右手的物品的重量差的平方成正比(这里补充一句,xhd每次搬两件东西,左手一件右手一件).例如xhd左手拿重量为3的物品,右手拿重量为6的物品,则他搬完这次的疲劳度为(6-3)^2 = 9.现在可怜的xhd希望知道搬完这2*k件物品后的最佳状态是怎样的(也就是最低的疲劳度),请告诉他吧.
     
    Input
    每组输入数据有两行,第一行有两个数n,k(2<=2*k<=n<2000).第二行有n个整数分别表示n件物品的重量(重量是一个小于2^15的正整数).
     
    Output
    对应每组输入数据,输出数据只有一个表示他的最少的疲劳度,每个一行.
     
    Sample Input
    2 1 1 3
     
    Sample Output
    4
     
    Author
    xhd
     
    Source
     
    Recommend
    lcy
     
     
     

    n个物品选K

    可以推出状态方程为:

    dp[i][k] = min(dp[i-1][k],dp[i-2][k-1]+(a[i]-a[i-1])*(a[i]-a[i-1]))

    dp[i][k] 表示k对物品在前i个物品中的最小值

    首先排序是为了每次取得差的平方最小

    对于第i个物品,可以取,可以不取。

    如果取,那么这个物品是和第i-1个配对,所以方程就是dp[i-2][k-1]+(a[i]-a[i-1])^2

    如果不取,那么方程就是dp[i-1][k] 
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<stdlib.h>
     4 #include<algorithm>
     5 using namespace std;
     6 int a[2000];
     7 int dp[2000][1000];
     8 int main()
     9 {
    10     int n,k;
    11     while(scanf("%d %d",&n,&k)!=EOF)
    12     {
    13         memset(a,0,sizeof(a));
    14         memset(dp,0,sizeof(dp));
    15         for(int i=1;i<=n;i++)
    16             scanf("%d",&a[i]);
    17         sort(a+1,a+n+1);
    18         for(int i=1;i<=k;i++)
    19         {
    20             for(int j=2*i;j<=n;j++)
    21             {
    22                 if(j==2*i)
    23                     dp[j][i]=dp[j-2][i-1]+(a[j]-a[j-1])*(a[j]-a[j-1]);
    24                 else
    25                     dp[j][i]=min(dp[j-1][i],dp[j-2][i-1]+(a[j]-a[j-1])*(a[j]-a[j-1]));
    26             }
    27         }
    28         printf("%d
    ",dp[n][k]);
    29     }
    30     return 0;
    31 }
    View Code
  • 相关阅读:
    java Activiti 工作流引擎 SSM 框架模块设计方案
    自定义表单 Flowable 工作流 Springboot vue.js 前后分离 跨域 有代码生成器
    数据库设计的十个最佳实践
    activiti 汉化 stencilset.json 文件内容
    JAVA oa 办公系统模块 设计方案
    java 考试系统 在线学习 视频直播 人脸识别 springboot框架 前后分离 PC和手机端
    集成 nacos注册中心配置使用
    “感恩节 ”怼记
    仓颉编程语言的一点期望
    关于System.out.println()与System.out.print("\n")的区别
  • 原文地址:https://www.cnblogs.com/clliff/p/3898488.html
Copyright © 2011-2022 走看看