程序员2007年3月刊上的一道算法题

       晚上无聊的时候把以前的<程序员>杂志拿出来see see,于是就看到了这个算法题.这文章之前也看过,但当时稍微想了一下就溜过去了.今天看的时候突然产生了一些疑问,于是动手写了几行代码测试了下,结果发现文章中的说法并不完全対.

      哦,讲了这么久,忘了说这个题在杂志的第65页的第二题.

     注意: 原文并没有给出最优策略 的定义,我这儿根据原文的意思考虑的是这样一种策略:

                  给出一种策略,使得在最坏的情况下,测试的次数最少

      下面是我写的代码:(动态规划算法,时间复杂度O(N^2))

java 代码
  1. /**  
  2.  原题: 有一个100层高的大厦,你手中有两个相同的玻璃围棋子。从这个大厦的某一层扔下围棋子就会碎,用你手中的这两个玻璃围棋子,找出一个最优的策略,来得知那个临界层面。  
  3.  算法(递归):  
  4.      记为n层楼时最少要测试的次数为f(n),则:  
  5.      1. f(1) =0;  
  6.      2. 考虑n+1时,若第一个棋子从第k层扔下,此时分两种情况  
  7.          a. 碎了. 则临界值不大于k,由于只剩一颗棋,只能从第1层开始往上测试,最多需再测试k-1次(此种情形共测试了k次)  
  8.          b. 没碎. 则临界值在k之上,此时还剩2颗棋,可归结到f(n+1-k)的情形(此种情况共测试了1+f(n+1-k)次)  
  9.        f(n+1) = min{ max{k,1+f(n+1-k)}: 1<=k<=n+1}  
  10.  @author Eastsun  
  11.  @version 1.0 2007/5/5  
  12. */   
  13. import  java.util.*;   
  14. public   class  Best{   
  15.      private   static  Map map = new  HashMap();   
  16.      //求n层楼时最少用的次数   
  17.      public   static   int  min( int  n){   
  18.          if (n< 0throw   new  IllegalArgumentException();   
  19.          if (n<= 1return   0 ;               //n<=1时,为了方便起见,这里记min(0) =0   
  20.         Integer s =map.get(n);   
  21.          if (s!= nullreturn  s;   
  22.          int  min =n;                      //一个上界(这是i取n次的情形): n   
  23.          for ( int  i= 1 ;i
  24.              int  t1 = 1  + min(n-i);        //没碎,递归求解   
  25.              int  t2 =t1>i?t1:i;           //两种情况的最坏情形   
  26.              if (min>t2) min =t2;   
  27.         }   
  28.         map.put(n,min);   
  29.          return  min;   
  30.     }   
  31.      private   static  List list = new  LinkedList();   //用于保存求解路径   
  32.      /**  
  33.       打印出测试路径  
  34.     */   
  35.      public   static   void  solve( int  n){   
  36.          if (n< 0throw   new  IllegalArgumentException();   
  37.          if (n<= 1 ){   
  38.             ListIterator iter =list.listIterator();   
  39.              if (!iter.hasNext())  return ;   
  40.             System.out.print(iter.next());   
  41.              while (iter.hasNext()) System.out.print( " -> " +iter.next());   
  42.             System.out.println();   
  43.              return ;   
  44.         }   
  45.          int  min =min(n);   
  46.          for ( int  i= 1 ;i<=n;i++){   
  47.              int  t1 = 1 +min(n-i);   
  48.              int  t2 =i>t1?i:t1;   
  49.              if (t2==min){   
  50.                 list.add(i);   
  51.                 solve(n-i);   
  52.                 list.remove(list.size()- 1 );   
  53.             }   
  54.         }   
  55.     }   
  56.      public   static   void  main(String[] args){   
  57.         System.out.println( "Min :" +min( 100 ));    //注意:有很多组结果   
  58.         solve( 100 );   
  59.     }   
  60. }  

运行程序可以看出,对于n=100的情形,存在很多种最优策略,第一次测试选择的楼层可以是从8到14的任意一层.

 

ps:贴上去的代码有点走样,请下载附件

AI量化学习入门指南:从零开始掌握人工智能投资策略 量化投资:利用数学模型和计算机算法进行投资决策的方法算法交易:自动执行预定义交易规则的系统机器学习:让计算机从数据中学习并改进的技术回测:用历史数据检验交易策略表现的过程特征工程:将原始数据转化为模型可理解的输入过拟合:模型过度适应历史数据,导致未来表现不佳夏普比率:衡量单位风险所获得的超额收益AI量化投资不仅仅是技术的应用,更是一种理性、系统化的投资哲学。它不追求预测市场的每一个拐点,而是通过概率思维和风险管理,在不确定性的市场中寻找统计优势。 阅读详情

相关推荐

【Java面试题汇总】JVM篇(2026版)

JVM内存模型、双亲委派模型、类加载机制、内存溢出、垃圾回收机制、内存泄漏、垃圾回收流程、垃圾回收器、G1、CMS、JVM调优

种一棵树最好的时间是十年前,其次是现在 3万+

找零钱问题

<br />找零钱问题<br />«问题描述<br />设有n种不同面值的硬币,各硬币的面值存于数组T[1:n]中。现要用这些面值的硬币来找钱,可以实用的各种面值的硬币个数不限。当只用硬币面值T[1],T[2],…,T[i]时,可找出钱数j的最少硬币个数记为C(i,j)。若只用这些硬币面值,找不出钱数j时,记C(i,j)=∞。<br />«编程任务<br />    设计一个动态规划算法,对1≤j≤L,计算出所有的C( n,j )。算法中只允许实用一个长度为L的数组。用L和n作为变量来表示算法的计算时间复杂

计算机编程开发学习交流的专栏 7412

PyTorch深度学习实战(7)——批大小对神经网络训练的影响

在神经网络中,批( batch )是指一次输入网络进行训练或推断的一组样本。批处理( batch processing )是指将这一组样本同时输入网络进行计算的操作。本节中首先介绍批( Batch )的基本概念,并且介绍批大小在神经网络训练过程中的影响。

盼小辉丶的博客 1万+

自己动态规划的第一题,数字三角形

1087: 三角形 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 72  Solved: 40 [Submit][Status][BBS] Description 7  3 8  8 1 0  2 7 4 4  4 5 2 6 5  (图一)  图一表示一个5行的数字三角形。假设给定一个n行数字

小马的博客 2323

20073月

1。 原文:http://blog.csdn.net/fanweiwei/archive/2007/02/22/1512562.aspx         ASP.NET中Visible="false" 在呈现成HTML标记语言时ASP.NET会去掉此标记语言,换句话说你用JS是取不到这个标记类容的,它被序列化后放入隐藏的VIEWSTATE中,只有服务器通过反序列化后才能调用到。        而...

weixin_34010949的博客 180

求职经历(一)——20073月20074月初

第一次求职的过程中由于个人方面的原因,只去了10个地方,可能有些地方也不应该去,但是也去了……以前没有什么写日记的习惯,经历的事情也逐渐的从记忆中淡忘了,这次培训能够把每一天的经历相对较为完整的整理记录下来感觉对自己确实也是有一定的帮助,即便有的时候没有提供解决的办法,但是至少有了解决的思路,经常整理的习惯还是应该保持的。1、辰联嘉通:如果我没记错的话,它是200611月份才成立的,地点

小袁的博客 6384

世界编程语言排行榜0803月

世界编程语言排行榜0803月TIOBE Programming Community Index for March 2008注: TIOBE 世界编程语言排行榜展现了编程语言的流行趋势。每个月,都有最新的数据被更新。这份排行榜的数据取样来源于互联网上富有经验的程序员、商业应用、著名的搜 索引擎(诸如谷歌、 MSN 、雅虎)的关键字排名、 Alexa 上的排名等。请注意这个排行榜只是反映了

华章IT官方博客 1万+

从20 程序员老兵做到上市公司合伙人,怎么少踩坑?

科技发展日新月异,对于程序员来说,不断地自我修炼必须提上日程。某种程度上,阅读是一条通往成功的捷径。 当你被技术难题卡住时,去读书吧,去书里寻找答案 当你感到人生困顿迷茫时,去读书吧,去书里寻找方向 当你的才华快要撑不起梦想时,去读书吧,去书里寻找勇气 到底什么样的工具书可以解决技术问题?什么样的书可以解决人生大课题?我们很多时候并不能很快找到答案 ,因此,CSDN倾力打造了一档IT领域阅读分享类栏目《悦读时间》,我们将持续联合各大出版社、企业和优秀图书作者、资深专家,为技术人精心筛选IT领域最实用的优质图

CSDN资讯 2396

你是女程序员吗?

20073月8日,妇女节在这特别的日子里,Vanni向所有女同志们说一声节日快乐,祝您们身体健康,工作顺利,家庭幸福!特别是奋斗在IT界的女程序员、开公汽大巴的女司机、负责城市清理的大婶,忠心的说一声您们辛苦啦!忠心的祝愿您们。。

Vanni的专栏 790

酝酿——2007计划雏形

        俗话说:“一日之计在于晨,一之计在于春。”在和一帮朋友快乐地进行新倒数之后,我便开始酝酿新的计划了。说到计划,不由得想起了“赶英超美,跑步进入共产主义”。确实,喊口号是容易的,订计划却是困难的。我不在乎计划是否宏伟,可行性才是唯一的关注点。        回首2006的经历,虽然不能算精彩,倒也对得起“充实”二字。在2006的基础之上,我又应该做些什么呢?        ...

weixin_33804990的博客 80

Bellman-Ford——贝尔曼福特算法

而今天学习的贝尔曼福特算法,是用于计算单源,且可含负边权的最短路径问题。其优于Dijkstra的方面是边的权值可以是负数,但还是那句话鱼和熊掌不可兼得啊,时间复杂度自然有点高。,1的距离+W<1到3的边权>)结果为3,再到k=2,2的距离不变,看2到3的距离min(3,2的最短距离+W<2到3的边权>)结果为2。我们之前学习了Dijkstra算法,用于计算单源,正边权的最短路径。,1的距离+W<1到2的边权>)结果为1,再从1到3的距离min(,接下来k=1,1到2的距离min(

2601_95090143的博客 276

LeetCode 69. x 的平方根(二分查找详解 + Java Python 实现)

x的平方根

2603_95532426的博客 179

20,84:有效的括号,柱状图中最大的矩形

这道题目又是一道有严格先后顺序的数据结构,所以我们可以使用栈来轻松解决这类问题。可以将字符串中处于左半部分的元素压入栈中,当遇到右半部分的元素时,我们可以将原来的元素先出栈,在和右半部分的元素进行比对,如果他俩是一对的话,就进行下一个循环,如果不是一对的话,就直接返回false,因为已经违反了规则。

2401_88017330的博客 158

算法详解4:买卖股票的最佳时机系列(上)

由于题目要求我们手中只能持有1股,所以在每天结束的时候我们手中就会出现持有股票和没有股票两种状态。那么我们不需要纠结今天到底该不该交易,我们只需要关注今天结束时,这两种状态下我的‘口袋里的现金’分别是多少。卖出股票就是“获得现金”,利润增加。我们将示例1代入到我们的方法中去获取了最小值1,但是最大值是7。我们不获取卖出时候的价格,只获取卖出时候的利润即可。题目要求我们在可以当天多次买卖股票,但是手中最多只能持有1股,然后获取最大利润。题目要求我们在某一天进行买入然后在之后的日子里面卖出从而获取最大利益。

qq_73640809的博客 371

leetcode 2091. 从数组中移除最大值和最小值 中等

将最大值和最小值都移除需要从数组前面移除 2 个元素,从数组后面移除 3 个元素。数组中只有这一个元素,那么它既是数组中的最小值又是数组中的最大值。将最大值和最小值都移除需要从数组前面移除 3 个元素。中有一个值最小的元素和一个值最大的元素。数组中的最大元素是 nums[1] ,值为 10。数组中的最小元素是 nums[1] ,值为 -4。数组中的最大元素是 nums[2] ,值为 19。数组中的最小元素是 nums[5] ,值为 1。你的目标是从数组中移除这两个元素。移除一个元素或从数组的。

2401_88085478的博客 238

算法论文/数据集3——CLD(TMLR2025)压缩训练集,仅保留对验证集有益的样本

CLD通过计算训练样本与同类验证集在训练过程中损失差分轨迹的Pearson相关性,筛选高相关样本构成coreset。仅依赖逐样本损失标量,无需梯度或特征,具备收敛性理论保证

ZhouDevin的博客 322

排序-堆排序(Heap Sort)

摘要:堆排序是一种基于二叉堆数据结构的原地排序算法,凭借稳定的 O(nlog n) 时间复杂度和 O(1) 的额外空间开销,弥补了冒泡、选择、插入排序在大规模数据下效率低下的短板。本文从堆的底层性质出发,完整讲解堆排序的原理、向上调整、向下调整、建堆逻辑与排序流程,重点剖析「升序建大根堆、降序建小根堆」这一核心口诀的根本原因,并给出可运行的 C++ 代码实现,帮助读者彻底吃透堆排序。

2401_87882972的博客 99

算法30,前缀和,和为k的子数组

✅“以前有没有出现过sum - k?有的话,有几个?每一个出现,都对应一个合法子数组。

sheshibenniaodan的博客 181

数据结构排序(四)

数据结构排序个人见解

2503_94479566的博客 323

2003-2024高铁站开通时间数据

2003-2024高铁站开通时间数据1、时间:2003-20242、来源:整理自高铁航线数据库(Chinese High-speed Rail and Airline Database,CRAD)3、指标:高铁站名称、开通时间、所在省份、所在城市、所属线路名称、以及相关备注4、指标说明:[高铁站名称]-高铁站名称[开通时间]-高铁站所属的高铁线路开通时间[所在省份]-高铁站所在省份[所在城市]-高铁站所在城市名称[所属线路名称]-高铁站所属的高铁线路名称[备注]-该高铁站只办理货运或具体停靠时间与开通时间不同等情况说明

离线安装 httpd.tar

离线安装httpd压缩文件带httpd及其依赖包

上一篇: 用动态代理进行修饰
下一篇: NetBeans IDE 6.0 Preview (Milestone 9) Available
JavaSxy
博客等级 码龄20年 1粉丝 25原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值