为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Python

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

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

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

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

f(d,n)=1+f(d−1,n−1)+f(d−1,n).f(d,n)=1+f(d1,n1)+f(d1,n).


g(d,n)=f(d,n+1)−f(d,n)g(d,n)=f(d,n+1)f(d,n),则:

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)g(d,n)=f(d,n+1)f(d,n)=[1+f(d1,n)+f(d1,n+1)][1+f(d1,n1)+f(d1,n)]=[f(d1,n+1)f(d1,n)]+[f(d1,n)f(d1,n1)]=g(d1,n)+g(d1,n1)


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

Ckn=Ckn−1+Ck−1n−1,Cnk=Cn1k+Cn1k1,


因此,由数学归纳法可知:g(d,n)=Cn+1d.g(d,n)=Cdn+1.n+1≥dn+1d时,Cn+1d=0.Cdn+1=0.对于f(d,n)f(d,n),有:

f(d,n)=++++[f(d,n)−f(d,n−1)][f(d,n−1)−f(d,n−2)]⋯[f(d,1)−f(d,0)]f(d,0).f(d,n)=[f(d,n)f(d,n1)]+[f(d,n1)f(d,n2)]++[f(d,1)f(d,0)]+f(d,0).


因为f(d,0)=0f(d,0)=0,因此f(d,n)=∑i=1nCid,d≥1.f(d,n)=i=1nCdi,d1.于是,科学家的问题就解决了。
  突然,丁丁又想到了:能不能用这个结果来解决鸡蛋掉落问题呢?答案是肯定的,对于给定的k=f(d,n)k=f(d,n),只需要对d从1开始算起,得到d,恰好使得f(d,n)≥k,f(d,n)k,则d即可鸡蛋掉落问题的解。
  科学家看了丁丁的解答,十分满意,他终于下定决心招丁丁为自己的助手。不过,丁丁说,他还要去外面的世界再看看,因此,科学家也没有挽留,但他祝愿丁丁好运。
  本文不再给出相关的程序,读者可以自己实现哦~~
  本文的参考文献为:https://brilliant.org/wiki/egg-dropping/


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

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

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

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

f(d,n)=1+f(d−1,n−1)+f(d−1,n).f(d,n)=1+f(d1,n1)+f(d1,n).


g(d,n)=f(d,n+1)−f(d,n)g(d,n)=f(d,n+1)f(d,n),则:

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)g(d,n)=f(d,n+1)f(d,n)=[1+f(d1,n)+f(d1,n+1)][1+f(d1,n1)+f(d1,n)]=[f(d1,n+1)f(d1,n)]+[f(d1,n)f(d1,n1)]=g(d1,n)+g(d1,n1)


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

Ckn=Ckn−1+Ck−1n−1,Cnk=Cn1k+Cn1k1,


因此,由数学归纳法可知:g(d,n)=Cn+1d.g(d,n)=Cdn+1.n+1≥dn+1d时,Cn+1d=0.Cdn+1=0.对于f(d,n)f(d,n),有:

f(d,n)=++++[f(d,n)−f(d,n−1)][f(d,n−1)−f(d,n−2)]⋯[f(d,1)−f(d,0)]f(d,0).f(d,n)=[f(d,n)f(d,n1)]+[f(d,n1)f(d,n2)]++[f(d,1)f(d,0)]+f(d,0).


因为f(d,0)=0f(d,0)=0,因此f(d,n)=∑i=1nCid,d≥1.f(d,n)=i=1nCdi,d1.于是,科学家的问题就解决了。
  突然,丁丁又想到了:能不能用这个结果来解决鸡蛋掉落问题呢?答案是肯定的,对于给定的k=f(d,n)k=f(d,n),只需要对d从1开始算起,得到d,恰好使得f(d,n)≥k,f(d,n)k,则d即可鸡蛋掉落问题的解。
  科学家看了丁丁的解答,十分满意,他终于下定决心招丁丁为自己的助手。不过,丁丁说,他还要去外面的世界再看看,因此,科学家也没有挽留,但他祝愿丁丁好运。
  本文不再给出相关的程序,读者可以自己实现哦~~
  本文的参考文献为:https://brilliant.org/wiki/egg-dropping/


原文出处

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消