微软的扔杯子问题-动态规划

本文介绍了微软面试中的一道题目,涉及如何解决扔杯子问题。通过不等式解法和动态规划两种策略进行分析,详细阐述了解题思路和步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在新浪微博上看到了一微软面试题


题目描述
一种杯子,若在第N层被摔破,则在任何比N高的楼层均会破,若在第M层不破,则在任何比M低的楼层均不会破,给你两个这样的杯子,让你在100层高的楼层中测试,要求用最少的测试次数找出恰巧会使杯子破碎的楼层。
不等式解法
所有讨论基于2个杯子的情况:
下图中所有图示的红线均表示剩下两个杯子的时候的试摔位置,当杯子破碎后,也就是只剩下一个杯子的时候,只需要从已知范围的最底层向已知范围的最高层逐层试摔。
当只有一层的时候,需要一次试摔。当有两层的时候,需要两次试摔。
当需要三层时候,首先讨论是否可以通过两次试摔完成,可以发现可以,方法如图。
当需要四层时候,首先讨论是否可以通过两次试摔完成,可以发现已经不行,因此至少需要三次试摔。
当需要五层时候,首先讨论是否可以通过小于等于三次试摔完成,如果不行则讨论最多四次试摔的情况。依次类推,如下图:


因此,当有100层的时候,最多需要n次试摔,使得 n+(n-1)+(n-2)+...+1 >= 100,然后对n上取整,因此n=14。最差情况需要14次试摔。 试摔方法为:第一次在14层扔,如果没破,在27层(14+13)继续扔,不破在39层(27+12)继续扔,依次类推。 如果破了,剩下一个杯子,从已知范围的最底层向已知范围的最高层逐层试摔。
动态规划解法
假设用dp[i][j]表示剩余i层,j个杯子时候最少需要多少次试摔。
(1)dp[i][1] = i,也就是说当只剩下一个杯子时,只能从第一层开始逐层向上试摔。
(2)dp[0][j] = 0,当只剩下0层时,只需要进行0次试摔。
(3)dp[1][j] = 1,当只剩下1层时,只需要进行1次试摔,前提是j>0
(4)dp[i][j] = min(1=<k<j)(max(dp[k-1][i-1], dp[j-k][i]) + 1),也就是当杯子破和不破的时候分成两个子问题,分别求解,之后求子问题试摔次数的最大和作为这种分解方法的试摔次数,之后取这些所有分
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值