动态规划法(六)鸡蛋掉落问题(二)

??上次我们讲到,我们的主人公丁丁由于用动态规划法解决了鸡蛋掉落问题(egg dropping problem)而获得了当地科学家的赏识。这不,正当丁丁还沉浸在解决问题的喜悦中,科学家又给丁丁出了一个难题:

假设有n个鸡蛋和d次尝试机会,那么,最多能探索多少层楼?

这无疑是鸡蛋问题的翻版,因为这两个问题实在太像了。丁丁没有犹豫,立马按照之前的想法开始思考:

??用\(f(d, n)\)表示该问题的解。假设从k层楼扔下鸡蛋(k足够大),若鸡蛋碎了,则剩下n-1个鸡蛋,d-1次尝试机会,最多能向下探索\(f(d-1, n-1)\)层楼;若鸡蛋没碎,则剩下n个鸡蛋,d-1次尝试机会,最多能向上探索\(f(d-1, n)\)层楼,于是:

\[f(d, n)=1+f(d-1, n-1)+f(d-1,n).\]

令\(g(d, n)=f(d, n+1)-f(d,n)\),则:

\[{\displaystyle
{\begin{aligned}
g(d, n)&=f(d, n+1)-f(d,n)\ &=[1+f(d-1,n)+f(d-1,n+1)]-[1+f(d-1,n-1)+f(d-1,n)]\&=[f(d-1, n+1)-f(d-1,n)]+[f(d-1,n)-f(d-1,n-1)]\&=g(d-1, n)+g(d-1,n-1)\end{aligned}}}
\]

因为\(f(0,n)=f(d,0)=0\),对于任意的\(n,d\),且\(f(d,1)=d\),故\(g(0,n)=0, g(d,0)=d.\)因为在组合数学中,有:

\[C_n^{k}=C_{n-1}^k+C_{n-1}^{k-1},\]

因此,由数学归纳法可知:\(g(d,n)=C_{d}^{n+1}.\)当\(n+1\geq d\)时,\(C_{d}^{n+1}=0.\)对于\(f(d,n)\),有:

\[{\displaystyle
{\begin{aligned}
f(d,n)=&[f(d,n)-f(d,n-1)]\+&[f(d,n-1)-f(d,n-2)]\+&\cdots \+&[f(d,1)-f(d,0)] \+&f(d,0).
\end{aligned}}}
\]

因为\(f(d,0)=0\),因此\(f(d,n)=\sum\limits_{i=1}^{n}C_{d}^{i}, d\geq 1.\)于是,科学家的问题就解决了。

??突然,丁丁又想到了:能不能用这个结果来解决鸡蛋掉落问题呢?答案是肯定的,对于给定的\(k=f(d,n)\),只需要对d从1开始算起,得到d,恰好使得\(f(d,n)\geq k,\)则d即可鸡蛋掉落问题的解。

??科学家看了丁丁的解答,十分满意,他终于下定决心招丁丁为自己的助手。不过,丁丁说,他还要去外面的世界再看看,因此,科学家也没有挽留,但他祝愿丁丁好运。

??本文不再给出相关的程序,读者可以自己实现哦~~

??本文的参考文献为:https://brilliant.org/wiki/egg-dropping/

注意:本人现已开通两个微信公众号: 用Python做数学(微信号为:python_math)以及轻松学会Python爬虫(微信号为:easy_web_scrape), 欢迎大家关注哦~~

原文地址:https://www.cnblogs.com/jclian91/p/9146602.html

时间: 2024-10-03 18:42:51

动态规划法(六)鸡蛋掉落问题(二)的相关文章

微信公众平台开发教程(六)获取个性二维码

微信公众平台开发教程(六)获取个性二维码 一.功能介绍 在进行推广时,我们可以告诉对方,我们的微信公众账号是什么,客户可以去搜索,然后关注.二维码给我们提供了极大的便捷,只要简单一扫描,即可关注. 如果已经关注过,立刻跳入对话画面.在我们进行推广时,不再是简陋的文字,可以是一个有个性的二维码,想必会很生动. 微信对二维码提供了很好的支持,而且还可以根据需要生成不同场景的二维码.下面我们将介绍如何获取和使用二维码. 注意:限服务号,且进行了微信认证,费用300 二.相关接口 为了满足用户渠道推广分

C++学习笔记十六-模板和泛型编程(二)

C++学习笔记十六-模板和泛型编程(二) 16.4 类模板成员 1.模板作用域中模板类型的引用: 通常,当使用类模板的名字的时候,必须指定模板形参.这一规则有个例外:在类本身的作用域内部,可以使用类模板的非限定名.例如,在默认构造函数和复制构造函数的声明中,名字 Queue 是 Queue<Type> 缩写表示.实质上,编译器推断,当我们引用类的名字时,引用的是同一版本.因此,复制构造函数定义其实等价于: Queue<Type>(const Queue<Type> &a

从PRISM开始学WPF(六)MVVM(二)Command?

原文:从PRISM开始学WPF(六)MVVM(二)Command? 从PRISM开始学WPF(一)WPF? 从PRISM开始学WPF(二)Prism? 从PRISM开始学WPF(三)Prism-Region? 从PRISM开始学WPF(四)Prism-Module? 从PRISM开始学WPF(五)MVVM(一)ViewModel? 从PRISM开始学WPF(六)MVVM(二)Command? 从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator? 命令绑定(Com

Elasticsearch入门教程(六):Elasticsearch查询(二)

原文:Elasticsearch入门教程(六):Elasticsearch查询(二) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/79237950 地理坐标点geo-point 地理坐标点:是指地球表面可以用经纬度描述的一个点. 地理坐标点可以用来计算两个坐标间的距离,还可以判断一个坐标是否在一个区域中,或在聚合中. 地理坐标点不能被

力扣第887题 鸡蛋掉落

力扣第887题 鸡蛋掉落 class Solution { public: int superEggDrop(int K, int N) { vector<vector<int>> dp(K+1, vector<int>(N+1, 0)); int m = 0; for (; dp[K][m] < N;) { m++; for (int k = 1; k <= K; k++) dp[k][m] = 1 + dp[k-1][m-1] + dp[k][m-1];

鸡蛋掉落

题目:鸡蛋掉落 问题描述: 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑. 每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去. 你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破. 每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X <= N). 你的目标是确切地知道 F 的值是多少. 无论 F 的初始值如何,你确

MySql学习(六) —— 数据库优化理论(二) —— 查询优化技术

逻辑查询优化包括的技术 1)子查询优化  2)视图重写  3)等价谓词重写  4)条件简化  5)外连接消除  6)嵌套连接消除  7)连接消除  8)语义优化 9)非SPJ优化 一.子查询优化 1. 什么是子查询:当一个查询是另一个查询的子部分时,称之为子查询. 2. 查询的子部分,包含的情况: a) 目标列位置:子查询如果位于目标列,则只能是标量子查询,否则数据库可能返回类似“错误:子查询只能返回一个字段 ( [Err] 1242 - Subquery returns more than 1

LeetCode887鸡蛋掉落——dp

题目 题目链接 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N  共有 N 层楼的建筑.每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去,如果没有碎可以继续使用.你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破.每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X <= N).你的目标是确切地知道 F 的值是多少.无论 F 的初始值如何,

六、angular 生成二维码

首先需要安装angular-qrcode : bower install monospaced/angular-qrcode npm install angular-qrcode 如何使用? 在相应的需要使用二维码的页面增加如下代码: 注意:这里的"version"和"size"可以根据github上面找出自己想要的结果: 生成含有图片的二维码: 这里没有angular插件方法,需要引入juquery的一个插件,插件在<我上传的文件>中:jquery.q