博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1421 搬寝室[DP]
阅读量:6859 次
发布时间:2019-06-26

本文共 1180 字,大约阅读时间需要 3 分钟。

搬寝室

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17775    Accepted Submission(s): 6031
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

思路:n个物品选k堆,直接上二维dp[ i ] [ j ].表示前 j 个物品选 k 对。

  1. 第j件物品不搬,即在前j - 1件物品中搬k对,那么疲劳值仍为f[k][j-1];
  2. 第j件物品要搬。那么依据上面所证,第j - 1件物品也要同一时候搬。即在前j - 2件物品中搬k - 1对物品,再搬最后一对物品,那么疲劳值为f[k -1][j - 2] + a[j - 1]。j - 1是由于对数必定比总物品数少1。

代码:

#include
#include
#include
#include
#include
#include
#include
#define INF 0x3f3f3f3fusing namespace std;typedef long long LL;int a[2010];int w[2010];int dp[1000][2010];int main(){ int n,k; while(scanf("%d%d",&n,&k)!=EOF) { for(int i=0;i

转载地址:http://umtyl.baihongyu.com/

你可能感兴趣的文章
Kubuntu 初始配置
查看>>
python中列表和元组的操作(结尾格式化输出小福利)
查看>>
用过的一些服务器集成软件
查看>>
一键拨打
查看>>
20120522:ERROR - ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
查看>>
Maven构建war项目添加版本号
查看>>
更新 手淘 flexible 布局 rem 单位适配问题
查看>>
第三次作业
查看>>
新浪微博登录接口实例
查看>>
wcf技术剖析_会话
查看>>
AngularJS 指令的 Scope (作用域)
查看>>
gitlab的使用
查看>>
iOS 生成本地验证码
查看>>
找不到 javax.servlet.http.HttpServletResponse 和 javax.servlet.http.HttpServletRequest 问题解决...
查看>>
Flip Game(枚举)
查看>>
WebWorker与WebSocket实现前端消息总线
查看>>
Selector
查看>>
Unity 2018.3.1 SyncVar没有同步服务器变量
查看>>
Linux命令(2) - 查看目录和文件大小: du -sh
查看>>
python的一些常用标准库
查看>>