Problem Description
搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆,因为n是一个小于2000的整数,实在是太多了,于是xhd决定随便搬2k件过去就行了.但还是会很累,因为2k也不小是一个不大于n的整数.幸运的是xhd根据多年的搬东西的经验发现每搬一次的疲劳度是和左右手的物品的重量差的平方成正比(这里补充一句,xhd每次搬两件东西,左手一件右手一件).例如xhd左手拿重量为3的物品,右手拿重量为6的物品,则他搬完这次的疲劳度为(6-3)^2 = 9.现在可怜的xhd希望知道搬完这2k件物品后的最佳状态是怎样的(也就是最低的疲劳度),请告诉他吧.
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]表示i个数据拿j次疲劳度最小。
然后考虑初始化问题,就是当数据只有刚好拿完的时候,那么结果就是从前到后两两拿最小。表达式为if(i==2j) {dp[i][j]=dp[i-2][j-1] (a[i]-a[i-1])(a[i]-a[i-1]);}
一般情况,对于每一个新物品,都要考虑拿不拿这个物品,如果拿了。他肯定要和前面一个凑成对,前面a[i-1]要确保不能动,那么dp[i][j]=dp[i-2][j-1] (a[i]-a[i-1])(a[i]-a[i-1]),如果不拿,那么dp[i][j]=dp[i-1][j];表示拿前i-1个数据拿j次。
那么状态转移方程为:if(i>2
j)dp[i][j]=min(dp[i-2][j-1] (a[i]-a[i-1])*(a[i]-a[i-1]),dp[i-1][j]);
注意i.和j 的大小关系。附上代码:

import java.util.Arrays;
import java.util.Scanner;
/** 思路:* 排序上升,寻找dp关系。i=2*j时。只能等于****/
public class 杭电1421 {public static void main(String[] args){Scanner sc=new Scanner(System.in);while(sc.hasNext()) {int n=sc.nextInt();//n个数据int k=sc.nextInt();//拿K次if(k*2>n||k<1||n<2)break;int a[]=new int[n 1];//物品质量int dp[][]=new int[1000][1000];for(int i=1;i<n 1;i  ){a[i]=sc.nextInt();}Arrays.sort(a,1,n 1);for(int i=1;i<=n;i  ){for(int j=1;j<=k;j  ){dp[i][j]=32768;}}           for(int  i=2;i<=n;i  ){for(int j=1;j<=n/2;j  ){if(i==2*j) {dp[i][j]=dp[i-2][j-1] (a[i]-a[i-1])*(a[i]-a[i-1]);continue;}else if(i>2*j)dp[i][j]=min(dp[i-2][j-1] (a[i]-a[i-1])*(a[i]-a[i-1]),dp[i-1][j]);}}System.out.println(dp[n][k]);}}   private static int min(int i, int j) {if(i<j)return i;else return j; }
}

杭电1421java实现相关推荐

  1. 【杭电ACM】1097 A hard puzzle

    [杭电ACM]1097  A hard puzzle http://acm.hdu.edu.cn/showproblem.php?pid=1097 先用int手写了算法结果竟然wrong answer ...

  2. 【ACM】杭电OJ 1106 函数atoi

    函数atoi是把字符串转化成整数的函数,头文件为 #include "stdlib.h" e.g. 运行环境:Dev-C++ 5.11 杭电1106 调用了sort函数,运行的时间 ...

  3. 【ACM】杭电OJ 2037

    题目链接:杭电OJ 2037 先把b[i]进行排序,然后,b[i]与a[i+1]进行比较. #include <iostream> #include <cstdio> #inc ...

  4. 【ACM】杭电OJ 2020(排序)

    题目链接:杭电OJ 2020 排序可以有冒泡排序,选择排序,或者直接调用函数. 下面是选择排序: #include <stdio.h> #include <math.h> in ...

  5. 【ACM】杭电OJ 2018

    题目链接:杭电OJ 2018 从n>4开始,每一年的牛的数量=前一年的牛的数量+三年前的牛的数量 问:为什么是三年前? 答:假设三年前有一头小牛出生,出生的那一年即为第一年,到了第四年,即三年后 ...

  6. 【ACM】杭电OJ 1005

     题目链接:杭电OJ 1005 超时代码如下(而且开辟的数组空间大小不够): #include <stdio.h> int m[100000]; int f(int n,int a,int ...

  7. 【ACM】杭电OJ 1004

     题目链接:杭电OJ 1004 运行环境:Dev-C++ 5.11 思路: 先把先把num数组全部赋值为1:第一个颜色单独输入,从第二个开始,需要与前面的进行比较,如果前面有相同的颜色,则在目前的nu ...

  8. 【ACM】杭电OJ 2012。

    题目链接:杭电OJ 2012 思路很简单,但是有一种高效算法显示编译错误,不知道为什么 运行环境:VS2017 AC代码: #include <stdio.h> #include < ...

  9. 【ACM】杭电OJ 1003。

    运行环境VS2017  题目链接:杭电OJ 1003 主要思想是: 用d[i]来存放前i项中最大的和,得到end,然后再倒推,得起始的位置begin 然而在程序42行的疑问,大家可以讨论一下吗???? ...

最新文章

  1. 22.CSS边框与背景【上】
  2. 一个免费的css编辑器——Free CSS Toolbox
  3. 黑马程序员----银行业务调度系统面试题
  4. Linux网络协议栈:网络包接收过程
  5. security框架工作笔记001--- Shiro和Spring Security对比_智慧城市项目中选型用Spring Security
  6. Python实现常用的数据结构
  7. python私有成员与公有成员_Python访问限制私有还是公有的介绍(附示例)
  8. “我爱淘”冲刺阶段Scrum站立会议3
  9. ios去掉字符串中的某个字符_Python中有用的字符串方法
  10. 移动咪咕盒子10款型号刷机固件汇总分享(附刷机教程)
  11. C++ 后台开发面试时一般考察什么?
  12. hive对字段去除空格trim()函数
  13. curl实现自动重启飞鱼星VW1900路由器
  14. nacos 未读取到合法数据,请检查导入的数据文件
  15. 2356,2372,2377,2388,2394
  16. PANTONE 色号
  17. Open Images Dataset V5 - Data Formats - Class Names
  18. k8s源码分析--kube-scheduler源码(一)
  19. 【小结】南京大学软件工程专硕2021二战小结
  20. 浅显易懂入门大数据系列:二、MapReduce、YARN(超详细)

热门文章

  1. 比特币钱包(5) BIP44 账户表示形式
  2. 关于“ModuleNotFoundError: No module named ‘flask._compat‘”的解决
  3. 【Win32汇编】字符串逆序
  4. angr学习笔记(13)(static_binary)
  5. 【网络安全】Metasploit 生成的 Shellcode 的导入函数解析以及执行流程分析(1)
  6. java判断文件或者文件夹
  7. 10、 HAVING:过滤分组
  8. 1.10 对象序列化控制输入输出
  9. 1080 Graduate Admission (30 分)【难度: 一般 / 知识点: 模拟 排序】
  10. 【PAT乙级】1062 最简分数 (20 分)