题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1421

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

解题思路:这是一道典型的dp问题。状态转移思想:因为要选择差值较小的两件物品,所以将物品按质量升序排序后,从前i件物品中拿走j对物品(j*2<=i)有如下两种情况:
(1)不拿第i件物品,则从前i件物品中拿走j对和从前i-1件物品拿走j对的最小疲劳值一样为dp[i][j]=dp[i-1][j]。
(2)拿第i件物品,则第i件物品肯定和第i-1件物品一起拿,则dp[i][j]=dp[i-2][j-1]+(a[i]-a[i-1])^2,即从前i-2件中拿j-1对的疲劳值加上拿了当前两件物品的疲劳值,于是可得到状态转移方程:dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]))。

AC代码:

 #include<bits/stdc++.h>
using namespace std;
int a[],dp[][];
int main(){
int n,k;
while(cin>>n>>k){
memset(dp,0x3f,sizeof(dp));//初始化为最大值,表示还没选取,以便比较取最小值
dp[][]=;//从0件物品中取走0对的疲劳值为0
memset(a,,sizeof(a));//清空
for(int i=;i<=n;i++){
cin>>a[i];
dp[i][]=;//同时将前i件物品中取走j=0对赋初值为0,表示不需要取任何物品
}
sort(a+,a+n+);//排序
for(int i=;i<=n;i++){//i从第2件开始挑选2*k件物品
for(int j=;j*<=i&&j<=k;j++)//j从挑选1对开始选择取与不取
dp[i][j]=min(dp[i-][j],dp[i-][j-]+(a[i]-a[i-])*(a[i]-a[i-]));
}
cout<<dp[n][k]<<endl;//从n件物品中选择k对的最小疲劳值
}
return ;
}

题解报告:hdu 1421 搬寝室(递推dp)的更多相关文章

  1. hdu 1421:搬寝室(动态规划 DP + 排序)

    搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  2. HDU 1421 搬寝室(经典DP,值得经常回顾)

    搬寝室 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status D ...

  3. HDU 1421 搬寝室 解题报告(超详细)

    **搬寝室 Time Limit: 2000/1000 MS Memory Limit: 65536/32768 K Problem Description 搬寝室是很累的,xhd深有体会.时间追述2 ...

  4. HDU 1421 搬寝室 (线性dp 贪心预处理)

    搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  5. HDU 1421 搬寝室

    搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  6. hdu 1421 搬寝室(dp)

    Problem Description 搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆, ...

  7. 【dp】HDU 1421 搬寝室

    http://acm.hdu.edu.cn/showproblem.php?pid=1421 [题意] 给定n个数,要从n个数中选择k个二元组{x,y},最小化sum{(x-y)^2} 2<=2 ...

  8. [HDU 1421]搬寝室(富有新意的DP)

    题目地址:pid=1421" target="_blank">http://acm.hdu.edu.cn/showproblem.php? pid=1421 题目大 ...

  9. hdu 1421 搬寝室 (dp)

    思路分析: dp[i][j] 表示选取到第 i 个   组成了 j 对的最优答案. 当然排序之后 选取相邻两个是更优的. if(i==j*2) dp[i][j] = dp[i-2][j-1] + w[ ...

随机推荐

  1. Java SpringMVC实现PC端网页微信扫码支付完整版

    一:前期微信支付扫盲知识 前提条件是已经有申请了微信支付功能的公众号,然后我们需要得到公众号APPID和微信商户号,这个分别在微信公众号和微信支付商家平台上面可以发现.其实在你申请成功支付功能之后,微 ...

  2. Android之怎样实现滑动页面切换【Fragment】

    Fragment 页面切换不能滑动 所以对于listview 能够加入的左右滑动事件 .不会有冲突比如(QQ的好友列表的删除)  Fragment 和viewpager 的差别  Viewpager ...

  3. storm的例子,一个非常好的网址

    https://insight.io/github.com/apache/storm/tree/HEAD/examples/storm-elasticsearch-examples/src/main/ ...

  4. Cubieboard搭建Hadoop指南

    1.刷固件 出厂的Cubieboard是Android系统,需要Linux系统安装Hadoop,到此网址下载: http://dl.cubieboard.org/software/a20-cubiet ...

  5. POJ2573 Bridge 经典的过桥问题

    曾经遇到过类似的.纪念一下!这题同一时候也是  ZOJ1877.经典的过桥问题 是有个博客解说的非常好的 戳这里 挺久曾经.遇到过一个基本一样的,那个题目仅仅要求求出 最短时间就可以,如今还有过桥的过 ...

  6. C实现头插法和尾插法来构建单链表(不带头结点)

    链表的构建事实上也就是不断插入节点的过程.而节点的插入能够分为头插法和尾插法. 头插法就是在头结点后插入该节点,始终把该节点作为第一个节点.尾插法就是在链表的最后一个节点处插入元素,作为最后一个节点. ...

  7. JSON序列化-化繁为简

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 2 Angular 2 的核心概念

    一.组件(Components): 组件是构成 Angular 应用的基础和核心,它是一个模板的控制类,用于处理应用和逻辑页面的视图部分.组件知道如何渲染自己及配置依赖注入,并通过一些由属性和方法组成 ...

  9. stl之vector的应用

    这里主要是对vector容器的一些常见应用的总结.至于vector的构造函数及初始化能够參考http://blog.csdn.net/lsh_2013/article/details/21191289 ...

  10. mysql10---索引优化

    D:\MYSQL\mysql-winx64\data\WIN-20171216YUR-slow.log是慢日志: ; ; # Time: :.472000Z # # Query_time: Rows_ ...