高楼扔鸡蛋问题(鹰蛋问题) POJ-3783
这是一道经典的DP模板题。
https://vjudge.net/problem/POJ-3783#author=Herlo
一开始也是不知道咋写,尝试找了很多博客,感觉有点领悟之后写下自己的理解。
题意就是:
对于一种蛋,如果它在第m层楼摔不碎,但是在第m+1层摔碎了,那么它的硬度就是m。
有若干层楼,你有若干个一样的蛋,你每一次尝试的结果都会是最坏的情况,问你在这种运气最差的情况下至少丢几次蛋才能知道它的硬度。
A. 如果蛋的数量是0,那根本都尝试不了,只能试0次
B. 如果你只有一个蛋,那你不敢随便丢吧?如果现在有100层你随便挑第50层一丢,它碎了,那你怎么确定它的硬度是多少?那么就只能从一楼开始一层一层往上试,直到它摔碎了,那么我们也确定了蛋的硬度。
C. 如果你有两个蛋,那么你可以先尝试着在第k层丢一个蛋
- 如果蛋碎了,那么你手中只剩下一颗蛋能试了,这个时候你也知道,从第k+1层往上的层你也不用再考虑了,接下来剩下的一个蛋就在第1到第k-1层做尝试就好了。
- 如果它没碎,那么你手中还剩下两颗完好的蛋,并且,这个时候k层下面的1到k-1层,你都不用考虑在这些层丢蛋了,肯定不会碎,那就只需要考虑从第k+1层开始到顶层,你该怎样去尝试,来测出这个蛋的硬度了。
看到上面两种情况,第一种情况,蛋的数量减小成为1了,并且待测的楼的层数也减少了,本质上变成了一个原问题的子问题,那么这个时候,我们可以看到当蛋只有一个,并且待测的楼层是k-1层时,这个答案肯定就是k-1啦,(只有一个蛋嘛)
第二种情况,蛋还是2个,不过待测的楼层数也减少了,这个也是原问题的子问题,我们可以看到因为扔一个蛋只可能出现碎与不碎两种情况,并且需要尝试的次数是由前面我们说到的这两种子问题的情况再加上1次得来的,那么因为题目说是最坏的情况,所以这两个子问题,自然是哪个次数大,就选哪个来加上1来推出规模更大的子问题。
D. 如果你有不止两个蛋,情况也是和上面说的一样,需要由子问题来推导得到,dp的本质也就是从子问题的最优解得到更大规模的子问题的最优解嘛。
我们的dp数组有两个维度,第一个是蛋的数量,第二个是待测的楼层数,
那么少不了两重循环来填表咯。
外层i就是蛋的数量,内层j就是待测的楼层数
E. 不过,这里还有一个问题,就是你在解决某一个子问题,假设是填dp【i】【j】这个格子的时候,如上文所说,你首先要在第k层先试扔一个吧?但这个k你怎么确定呢?这个时候,因为题目要求的是最小的扔的次数,所以最暴力的方法当然就是对于所有可能的k都遍历一遍啦,然后取一个最小的值来填我们的dp【i】【j】咯。
所以既然这样,我们先将所有dp都设置为INF(无限大),因为要取一个最小值来填dp【i】【j】嘛,然后,上文A、B中的情况是不需要推出来的,是直接可以得到的结果,也就是我们的初始化条件。
然后就是我们的三重循环填dp啦,
递推式在代码中,结合上述文字仔细品味一下,应该不太难理解。
此外,对于上文E这句话中的k值,好像还有更加优化的方法去做?(比如二分吗?)留待以后更新
题解代码
#include<iostream>
#include<cstdio>
using namespace std;
const int INF = 0x3f3f3f3f;
int cnt = 0,N;
const int maxn = 10005;
int T,id,B,M;
int dp[55][1005];
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&id,&B,&M);
for(int i=1;i<=B;i++){
for(int j=1;j<=M;j++)
dp[i][j] = INF;
for(int i=0;i<=B;i++) dp[i][1] = 1, dp[i][0] = 0;
for(int i=0;i<=M;i++) dp[1][i] = i;
for(int i=2;i<=B;i++){
for(int j=2;j<=M;j++){
for(int k=1;k<=j;k++)
dp[i][j] = min(dp[i][j],1+max(dp[i-1][k-1],dp[i][j-k]));
}
}
cout<<id<<" "<<dp[B][M]<<endl;
}
return 0;
}
高楼扔鸡蛋问题(鹰蛋问题) POJ-3783的更多相关文章
- Google面试题-高楼扔鸡蛋问题
本文由 @lonelyrains 出品.转载请注明出处. 文章链接: http://blog.csdn.net/lonelyrains/article/details/46428569 高楼扔鸡蛋问 ...
- zstu 4214 高楼扔鸡蛋(google 面试题)dp
input T 1<=T<=10000 n m 1<=n<=2000000007 1<=m<=32 output m个鸡蛋从1到n哪一楼x扔下去刚好没碎,而再x+1 ...
- Chernobyl’ Eagle on a Roof(鹰蛋坚固度)
链接 Chernobyl’ Eagle on a Roof 题意 引用论文题意:有一堆共 M 个鹰蛋,一位教授想研究这些鹰蛋的坚硬度 E.他是通过不断从一幢 N 层的楼上向下扔鹰蛋来确定 E 的.当鹰 ...
- What number should I guess next ?——由《鹰蛋》一题引发的思考
What number should I guess next ? 这篇文章的灵感来源于最近技术部的团建与著名的DP优化<鹰蛋>.记得在一个月前,查到鹰蛋的题解前,我在与同学讨论时,一直试 ...
- [CareerCup] 6.5 Drop Eggs 扔鸡蛋问题
6.5 There is a building of 100 floors. If an egg drops from the Nth floor or above, it will break. I ...
- poj 3783 Balls 动态规划 100层楼投鸡蛋问题
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4098409.html 题目链接:poj 3783 Balls 动态规划 100层楼投鸡蛋问题 ...
- 扔鸡蛋问题具体解释(Egg Dropping Puzzle)
经典的动态规划问题,题设是这种: 假设你有2颗鸡蛋,和一栋36层高的楼,如今你想知道在哪一层楼之下,鸡蛋不会被摔碎,应该怎样用最少的測试次数对于不论什么答案楼层都可以使问题得到解决. 假设你从某一层楼 ...
- 扔鸡蛋问题详解(Egg Dropping Puzzle)
http://blog.csdn.net/joylnwang/article/details/6769160 经典的动态规划问题,题设是这样的:如果你有2颗鸡蛋,和一栋36层高的楼,现在你想知道在哪一 ...
- Balls(扔鸡蛋问题)
4554 BallsThe classic Two Glass Balls brain-teaser is often posed as:“Given two identical glass sphe ...
随机推荐
- 5、修改oracle的字符集
注意:修改字符集前需要将表空间进行数据泵备份: 5.1.修改server端字符集: 1.登录到oracle实例查看字符集: [oracle@slave-node2 ~]$ echo $ORACLE_S ...
- Linux:从windows到linux的shell脚本编码和格式
从windows到linux的shell脚本编码和格式问题 异常问题 :set ff=unix 启动脚本在启动时报错比如执行sh start.sh,时会报Command not found等等的错误, ...
- inux下查看最消耗CPU、内存的进程
1.CPU占用最多的前10个进程: ps auxw|head -1;ps auxw|sort -rn -k3|head -10 2.内存消耗最多的前10个进程 ps auxw|head -1;ps a ...
- Redis+Lua解决高并发场景抢购秒杀问题
之前写了一篇PHP+Redis链表解决高并发下商品超卖问题,今天介绍一些如何使用PHP+Redis+Lua解决高并发下商品超卖问题. 为何要使用Lua脚本解决商品超卖的问题呢? Redis在2.6版本 ...
- UFT对于PDF 文档的操作方法 VBS代码
1.首先需要安装Adobe Acrobat,而不是Adobe Reader 2.理解AcroExch.App .AcroExch.AVDoc.AcroExch.PODoc App 主要管理应用级别的对 ...
- JVM优化过头了,直接把异常信息优化没了?
你好呀,我是why. 你猜这次我又要写个啥没有卵用的知识点呢? 不好意思,问的稍微有点早了,啥提示都没给,咋猜呢,对吧? 先给你上个代码: public class ExceptionTest { ...
- scrapy::Max retries exceeded with url
运行scrapy时出错这个错误:Max retries exceeded with url解决方法: img1=requests.get(url=aa,headers=header1,timeout= ...
- es-head部署
#一.更新centos7的库sudo yum update -y二.安装一系列文件(已安装可以不安装)sudo rpm -ivh http://dl.fedoraproject.org/pub/epe ...
- MQTT 4 ——MQTT的Spring Mvc 配置接收字节流数据
本篇记录一下MQTT整合Spring Mvc配置直接收发字节流数据 设备方是纯C开发,并且为了交互数据的安全,将传送的数据用了AES CBC进行了加密. 接下来正常方便做法应该是 将加密后的字节流转换 ...
- 学习Git的基本业务逻辑
1,基本业务逻辑(假设针对index.html文件中内容): 1,在init版本库之前已写好开头部分:index 对index进行git init版本库: 进入到文件夹中,git init git a ...