hdu---(1421)搬寝室(dp)
搬寝室
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17687 Accepted Submission(s): 6000
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
转移方程: dp[i][j]=min{dp[i-1][j],dp[i-2][j-1]+(aa[i]-aa[i-1])*(aa[i]-aa[i-1])};
代码:
1 #include<cstdio>
2 #include<cstring>
3 #include<algorithm>
4 #include<iostream>
5 using namespace std;
6 const int maxn=2002;
7 const int inf=0x3f3f3f3f;
8 int aa[maxn],dp[maxn][maxn];
9 int n,k;
10 int main()
11 {
12 while(scanf("%d%d",&n,&k)!=EOF)
13 {
14 for(int i=1;i<=n;i++)
15 scanf("%d",aa+i);
16 sort(aa+1,aa+n+1);
17 for(int i=1;i<=n;i++)
18 {
19 for(int j=1;j<=k;j++)
20 dp[i][j]=inf;
21 }
22 dp[0][0]=0;
23 for(int i=2;i<=n;i++)
24 {
25 for(int j=1;2*j<=i;j++){
26 dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(aa[i]-aa[i-1])*(aa[i]-aa[i-1]));
27 }
28 }
29 printf("%dn",dp[n][k]);
30 }
31 return 0;
32 }
对其进行优化,压缩空间由于只涉及到dp[i-1],dp[i-2],dp[i];所以舍去其他空间
代码:
1 #include<cstdio>
2 #include<cstring>
3 #include<algorithm>
4 #include<iostream>
5 using namespace std;
6 const int maxn=2002;
7 const int inf=0x3f3f3f3f;
8 int aa[maxn],dp[3][maxn];
9 int n,k;
10 int main()
11 {
12 while(scanf("%d%d",&n,&k)!=EOF)
13 {
14 for(int i=1;i<=n;i++)
15 scanf("%d",aa+i);
16 sort(aa+1,aa+n+1);
17 for(int i=0;i<=2;i++)
18 {
19 for(int j=1;j<=k;j++)
20 dp[i][j]=inf;
21 }
22 dp[0][0]=0;
23 for(int i=2;i<=n;i++)
24 {
25 for(int j=1;2*j<=i;j++){
26 dp[i%3][j]=min(dp[(i-1)%3][j],dp[(i-2)%3][j-1]+(aa[i]-aa[i-1])*(aa[i]-aa[i-1]));
27 }
28 }
29 printf("%dn",dp[n%3][k]);
30 }
31 return 0;
32 }
- JavaWeb项目之电话本,两个版本,以及总结反思
- 工作中问题记录
- Java导出数据生成Excel表格
- Layui常见问题
- layui动态设置下拉框数据,根据后台数据设置选中
- BCryptPasswordEncoder加密及判断密码是否相同
- 两个HTML,CSS布局实例
- cors解决Web跨域访问问题
- Java之集合初探(二)Iterator(迭代器),collections,打包/解包(装箱拆箱),泛型(Generic),comparable接口
- IIS中实现HTTPS的自动跳转
- Windows Server下IIS安装PHP+MySql环境
- Python玩机器学习简易教程
- 腾讯云服务器搭建个人博客教程
- Ubuntu下安装Nginx+PHP+MySql环境
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- RecyclerVIew实现悬浮吸顶效果
- 小程序地图学习之获取位置 获取经纬度 获取地名 获取地址
- 详解okhttp3 请求头不能为中文的坑
- Android为TextView添加字体库和设置描边的方法
- Android 解决WebView调用loadData()方法显示乱码的问题
- Android 自定义TextView去除paddingTop和paddingBottom
- Android MeasureSpec的理解和源码的解析
- Android 中自定义ContentProvider与ContentObserver的使用简单实例
- Android沉浸式状态栏的实现代码
- MyBatis源码解析之基础模块—DataSource
- Android中Activity和Fragment传递数据的两种方式
- Android MTU 值修改的实例详解
- Android ListView填充数据的方法
- AFURLSessionManager 上传下载使用代码说明
- Android APP之WebView校验SSL证书的方法