题目描述:

搬寝室是很累的,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件物品后的最佳状态是怎样的(也就是最低的疲劳度),请告诉他吧。

输入:

每组输入数据有两行,第一行有两个数n,k(2<=2*k<=n<2000).第二行有n个整数分别表示n件物品的重量(重量是一个小于2^15的正整数).

输出:

对应每组输入数据,输出数据只有一个表示他的最少的疲劳度,每个一行.

样例输入:
2 1
1 3
样例输出:
4

这个题一开始就觉得是用动态规划来做。但到底怎么样去使用,还是没有想出来。看了看别人的代码
dp[n][k] 表示从前n个物品中选出2*k个物品的最小疲劳度
若先对物品进行排序,发现相邻的两个肯定是差最小的,故对第i件物品,若不选第i件物品
则dp[i][j] = dp[i-1][j] 前提是2*j <= i-1
否则若选则第i件物品,则与它的差最小的则是第i-1件物品,那么第i-1件物品也应被选择
dp[i][j] = dp[i-2][j-1] + (w[i]-w[i-1])*(w[i]-w[i-1])
另外就是初始化的问题,这个是个令人头疼的问题
代码如下
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std; int n, k;
int w[]; int cmp(int a, int b) {
return a < b;
} int dp[][];
int main(int argc, char const *argv[])
{
while(scanf("%d %d",&n,&k) != EOF) {
for(int i = ; i <= n; i++) {
scanf("%d",&w[i]);
}
sort(w+, w++n, cmp);
memset(dp, -, sizeof(dp));
dp[][] = (w[]-w[])*(w[]-w[]);
for(int i = ; i <= n; i++) {
dp[i][] = ;
}
for(int i = ; i <= n; i++) {
for(int j = ; j<= k && *j <=i; j++) {
if(dp[i-][j] == -) {
dp[i][j] = dp[i-][j-] + (w[i]-w[i-])*(w[i]-w[i-]);
}
else {
dp[i][j] = min(dp[i-][j], dp[i-][j-] + (w[i]-w[i-])*(w[i]-w[i-]));
} //printf("%d ",dp[i][j]);
}
// puts("");
}
printf("%d\n",dp[n][k]);
}
return ;
}

一开始的代码如下

 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std; int n, k;
int w[]; int cmp(int a, int b) {
return a < b;
} int dp[][];
int main(int argc, char const *argv[])
{
while(scanf("%d %d",&n,&k) != EOF) {
for(int i = ; i <= n; i++) {
scanf("%d",&w[i]);
}
sort(w, w+n, cmp);
memset(dp, -, sizeof(dp));
dp[][] = (w[]-w[])*(w[]-w[]);
for(int i = ; i <= n; i++) {
dp[i][] = ;
}
for(int i = ; i <= n; i++) {
for(int j = ; j<= k && *j <=i; j++) {
if(dp[i-][j] == -) {
dp[i][j] = dp[i-][j-] + (w[i]-w[i-])*(w[i]-w[i-]);
}
else {
dp[i][j] = min(dp[i-][j], dp[i-][j-] + (w[i]-w[i-])*(w[i]-w[i-]));
} //printf("%d ",dp[i][j]);
}
// puts("");
}
printf("%d\n",dp[n][k]);
}
return ;
}

第22行有错误,因为w下标从1开始,所以排序时你的下标不能从0开始

九度oj 题目1452:搬寝室的更多相关文章

  1. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  2. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  3. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  4. 九度oj 题目1007:奥运排序问题

    九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...

  5. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  6. 九度OJ题目1105:字符串的反码

    tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...

  7. 九度oj题目1009:二叉搜索树

    题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...

  8. 九度oj题目1002:Grading

    //不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...

  9. 九度OJ题目1003:A+B

    while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...

随机推荐

  1. HDU 5501 The Highest Mark (贪心+DP,经典)

    题意: 有n道题目,每道题目的初始分数为Ai,分数每分钟减少Bi,完成此题需要Ci分钟,问在t分钟内最多能获得多少分? 思路: 好题~ 如果没有B的话,就是一道裸的01背包的题目了.每道题目的得分为: ...

  2. 【Python图像特征的音乐序列生成】深度卷积网络,以及网络核心

    这个项目主要涉及到两个网络,其中卷积神经网络用来提取图片表达的情绪,提取出一个二维向量. 网络结构如图: 词向量采用预训练的glove模型,d=50,其他信息包括了图片的“空旷程度”.亮度.对比度等信 ...

  3. 【转】NSBundle的使用,注意mainBundle和Custom Bundle的区别

    1.[NSBundle mainBundle],文件夹其实是Group,如左侧的树形文件管理器 Build之后,文件直接就复制到了根目录下,于是读取的方法,应该是这样: NSString *earth ...

  4. 用python写trojan的过程中遇到的各种问题

    由于之前已经conn, addr = s.accept() 所以改为  conn.recv spyder无法同时运行client 和 server 分别在spyder和anaconda prompt运 ...

  5. CSS选择器基本介绍

    一.web标准 所谓的web标准就是用来衡量我们当前的网页书写是否规范的一系列要求,这个标准是由W3C组织制定,在web标准中具体的要求就是结构.样式.行为三者相分离 结构:通过HTML标签来搭建的网 ...

  6. Windows无法停用设备,原因是某个程序正在使用它...

    有时候,当我们用完U盘需要弹出是,会出现“Windows无法停用设备,原因是某个程序正在使用它…”的黄色警告,很无奈.不过可以通过一些方法进行解决(win10版): 1. 打开“文件资源管理器”,选择 ...

  7. WINDOWS-基础:LPTSTR

    1. LPTSTR解释 与char*等价,表示普通字符/字符串变量,指向字符/字符串的指针. LP:  长指针(long pointer). T:   win32环境中有一个_T宏,用来标识字符是否采 ...

  8. SQLServer死锁

    死锁的四个必要条件:互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用.请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源.非剥夺条件( ...

  9. Python——函数基础

    函数是什么 它相当于一个独立的代码块,可以被重复使用,如果需要增加一个功能或者修改一个功能,只需要,增加或者修改函数即可. 函数分类 内置函数 python解释器已经为我们定义好的参数,比如:len( ...

  10. mysql 安装简介

    Linux: 安装 [root @ localhost ~]# yum install mysql-server 设定为开机自动启动 [root @ localhost ~]# chkconfig m ...