x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机。
各大厂商也就纷纷推出各种耐摔型手机。x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来, 之后才允许上市流通。
x星球有很多高耸入云的高塔,刚好可以用来做耐摔测试。塔的每一层高度都是一样的,与地球上稍有不同的是,他们的
第一层不是地面,而是相当于我们的2楼。 如果手机从第7层扔下去没摔坏,但第8层摔坏了,则手机耐摔指数=7。
特别地,如果手机从第1层扔下去就坏了,则耐摔指数=0。 如果到了塔的最高层第n层扔没摔坏,则耐摔指数=n
为了减少测试次数,从每个厂家抽样3部手机参加测试。
某次测试的塔高为1000层,如果我们总是采用最佳策略,在最坏的运气下最多需要测试多少次才能确定手机的耐摔指数呢?
请填写这个最多测试次数。 注意:需要填写的是一个整数,不要填写任何多余内容。

如果没有看懂题目意思的老哥,建议可以先看李永乐老师的视频:《复工复产找工作?先来看看这道面试题:双蛋问题》

(1)我们先假定如果只有一个手机的话,那么你也只能从第一层开始进行测试(因为此时你只有一个手机,如果随机从某一层 k 开始,假设这时摔坏了,你只能确定的是它的耐摔指数是在k以下的),直到测试到 i 层(假定第i层时摔坏 且 1<=i<=塔的最大高度 ),由于是在最坏运气下的次数,那么只有可能是一直测到塔的最大高度时才知道结果,即此时测试次数只跟塔的高度有关

但如果是有二个或二个以上的手机的话,那么就要分两种情况讨论

我们假设有 j 个手机(j>=2), 塔高为 n
如果此时我们从第 i 层开始进行测试,此时就会有两种情况(而我们只需要选择这两种情况中值较大的那个即可(题目要求的是最坏情况))

(2)第一种: 手机没摔坏,说明手机的耐摔指数肯定大于 i ,那么就只需从第 i+1(即n-i)层以上开始测试即可

(3)第二种: 手机摔坏了,那么手机的耐摔指数肯定小于 i ,那么就只需要从第 i-1层以下开始测试即可,由于手机摔坏了一个,因此手机数量需要减一( j - 1 )

=============================================================
对于以上的结论,得出以下的结果
在引出结果之前需要创建一个二维数组来存放测试的数据 dp[ n + 1 ][ j + 1 ]
dp[ i ][ j ] 表示塔高为 i 层时, j 部手机在最坏运气下最多需要测试的次数

对于(1)的结论,我们可以得出: dp[ i ] [ 1 ] = i ;
对于(2)的结论,我们可以得出: dp[ i ] [ j ] = dp[ n - i ] [ j ] + 1
对于(3)的结论,我们可以得出: dp[ i ] [ j ] = dp[ i - 1 ] [ j - 1 ] + 1

由(2)(3)结论可以归纳出:
dp[ i ][ j ] = max( dp[ n - i ] [ j ] + 1 , dp[ i - 1 ] [ j - 1 ] + 1 )

代码如下

public class Question_04 {public static void main(String[] args) {int[][] dp = new int[1000+1][3+1];for (int i = 1; i < dp.length; i++) {dp[i][1] = i;}for (int i = 1; i < dp.length; i++) {//由于上面已经设置了手机数量为1时的测试次数了//所以只需从手机数量为2开始进行遍历即可for (int j = 2; j < dp[0].length; j++) {//取一个不影响结果的数int min = Integer.MAX_VALUE;//从第1层到第 i 层,逐一尝试所有决策,取最优的//每一层最坏情况下(max 测试次数最多)的最好结果(min)for (int k = 1; k <= i; k++) {min = Math.min(min, Math.max(dp[k-1][j-1], dp[i-k][j]));}//需要加上本次测试的次数,因此需要+1dp[i][j]=min+1;}}System.out.println(dp[1000][3]);}
}

最后的答案是 19

此题参考了博主的文章https://blog.csdn.net/hebtu666/article/details/84789853

2018 第九届 蓝桥杯 JavaB组 摔手机(动态规划解决)相关推荐

  1. 2018第九届蓝桥杯JavaB组省赛真题及详解

    2018第九届蓝桥杯JavaB组省赛真题及详解 第一题:第几天 第二题:方格计数 第三题:复数幂 第四题:测试次数 第五题:快速排序 第六题:递增三元组 第七题:螺旋折线 第八题:日志统计 第九题:全 ...

  2. 2018年第九届蓝桥杯 JavaB组省赛 刷题思路及答案

    前言 本人是二本院校大二的计算机系学生,已经报名了下一届的蓝桥杯省赛,整个寒假学习了很多算法知识,我是看<算法很美>这个课程学习算法的,一套学习下来确实受益匪浅,视频在b站上面都有. 此前 ...

  3. 第九届蓝桥杯JavaB组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.第几天 题目描述 2000年的1月1日,是那一年的第1天. 那么,2000年的5月4日,是那一年的第几天? 注意:需要提交的是一个整数 ...

  4. 2018第九届蓝桥杯JavaA组省赛真题详解

    目录 第一题:分数 第二题:星期一 第三题:复数幂 第四题:方格计数 第五题:打印图形 第六题:航班时间 第七题:三体攻击 第八题:全球变暖 第九题:倍数问题 第十题:付账问题 题解待更新 第一题:分 ...

  5. 2018第九届蓝桥杯B组决赛-搭积木

    标题:搭积木 小明对搭积木非常感兴趣.他的积木都是同样大小的正立方体. 在搭积木时,小明选取 m 块积木作为地基,将他们在桌子上一字排开,中间不留空隙,并称其为第0层. 随后,小明可以在上面摆放第1层 ...

  6. 全球变暖java_第九届 蓝桥杯 JavaB组 全球变暖

    标题:全球变暖 你有一张某海域NxN像素的照片,"."表示海洋."#"表示陆地,如下所示: - .##- .##- -##. -####. -###. - 其中 ...

  7. 2018第九届蓝桥杯B组决赛题解第六题 矩阵求和

    标题:矩阵求和 经过重重笔试面试的考验,小明成功进入 Macrohard 公司工作. 今天小明的任务是填满这么一张表: 表有 n 行 n 列,行和列的编号都从1算起. 其中第 i 行第 j 个元素的值 ...

  8. 2018第九届蓝桥杯B组决赛题解第一题 换零钞

    标题:换零钞 x星球的钞票的面额只有:100元,5元,2元,1元,共4种. 小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱. 小明有点强迫症,他坚持要求200元换 ...

  9. 2018第九届蓝桥杯大赛软件类B组C/C++省赛题解

    2018第九届蓝桥杯大赛软件类B组C/C++省赛目录 试题 A:第几天(结果填空) 试题 B:明码(结果填空) 试题 C:乘积尾0(结果填空) 试题 D:测试次数(结果填空) 试题 E:快速排序(结果 ...

最新文章

  1. ubuntu下使用conda出现solving environment失败
  2. python  字典 元组 集合 列表 字符串 字节数组 常用的方法总结
  3. 【笨嘴拙舌WINDOWS】字符类型与字符串
  4. kettle获取当前日期_kettle中通过 时间戳(timestamp)方式 来实现数据库的增量同步操作(一)...
  5. SAP系统内部顾问如何培养
  6. 【Git入门之五】版本管理
  7. 生产服务器怎么dmp堆栈信息,如何根据程序崩溃时的DMP文件使用WinDbg查找调用堆栈...
  8. Android sdk 搭建
  9. 蓝星微商城源码+搭建教程源码
  10. 区块链开发金融交易平台
  11. c语言魔方阵难不难,C语言魔方阵问题
  12. 计算机一级形状填充在哪里,ps填充快捷键,ps填充图案在哪怎么用?
  13. uniapp 手机端时禁止输入框弹出键盘,使用自定义键盘
  14. Android10的GPU呈现模式分析在哪?
  15. 推荐几款免费视频格式转换软件,比格式工厂更好用
  16. 2023最新整理,Android车载操作系统开发揭秘,无偿分享!
  17. 手机电子邮箱怎么注册?手机电子邮箱格式怎么写?
  18. Unity Render Streaming 云渲染尝鲜
  19. SecureCRT8.5的下载、安装和注册(详细图解)
  20. MFC进度条控件(六)

热门文章

  1. crt、cer类型证书转换成bks
  2. CS229 --Lecture1 Introduction
  3. spyeye手机远程控制手机苹果免越狱封装支持扫码安装
  4. 创建第一个SpringBoot项目
  5. 友链——一群dalao
  6. 计算机网络术语总结1
  7. Java 通过SMTP实现发送QQ邮件
  8. matlab抠图数据,MATLAB抠图
  9. 2021 年,中台的“瓜”你还吃吗?
  10. Excel如何从单元格中提取数值