887. 鸡蛋掉落 (DP+二分)

https://leetcode-cn.com/problems/super-egg-drop/

/*
首先分析1个蛋,1个蛋的话,最坏情况需要N次,每次只能从0 1 2 。。。开始
如果蛋的个数随便用,或者说2的k次方大于等于N楼层高度,则可以利用二分。
如果蛋的个数为2,100层楼
1 。。。 100
比如第一次从10,如果碎了,那么还剩一个蛋,1+10次;如果没有碎,到20层仍。如果碎了,2+10次。如果没碎。。。
所以次数是 11 12 13 14 15 16 17 18 19 ,所以最坏可能19次
所以我们要想办法,确定每次下仍的楼层 p, 0=<p1,p2,p3,p4,p5,p6,p7,p8,p9<=N 使得不管每次的次数比较均匀。即例如
p1+p2+p3+p4+p5+p6+p7+p8+p9 = 100
p2-p1=p1-1
p3-p2=p1-2
....
p1=14 p2=27 p3=39 p4=51 p5=62 p6=72 p7=81 p8=89 p9=96 p10=100
那么如果有k个蛋,那么,d[N][K]就是最坏情况下的最小次数
假设在第p层下仍,蛋碎的话 d[p-1][k-1]为p层,k-1个蛋的最小次数
蛋不碎的话,d[N-p][k] 为N-p层,k个蛋的最小次数
最坏情况就是,d[N][k] = Max(d[p-1][k-],d[N-p][k])+1
最坏情况下最小,就是要找一个合适的p使得 MIN(Max(d[p-1][k-],d[N-p][k]))其中 1=<p<=N
*/
const INT_MAX = int(^uint(0) >> 1)
func superEggDrop(K int, N int) int {
d := make([][]int,N+1)
for i:=0;i<=N;i++{
d[i] = make([]int,K+1)
} for i:=0;i<=N;i++{
d[i][1] = i
d[i][0] = 0
}
for j:=0;j<=K;j++{
d[0][j] =0
d[1][j] = 1
}
d[0][1] = 0
d[1][0] = 0
d[0][0] = 0
for i:=2;i<=N;i++{
for j:=2;j<=K;j++{
m := INT_MAX
for p:=1;p<=i;p++{
tmp := MAX(d[p-1][j-1],d[i-p][j])+1
m = MIN(tmp,m)
}
d[i][j] = m
}
}
return d[N][K]
} func MAX(i,j int) int{
if i<j{
return j
}else{
return i
}
} func MIN(i,j int) int{
if i<j{
return i
}else{
return j
}
}

  

复杂度分析:

  • 时间复杂度:O(N^2K)O(N2K),三层 for 循环,每层循环都是线性的;
  • 空间复杂度:O(NK)O(NK),表格的大小

1. 线性DP 887. 鸡蛋掉落 (DP+二分)的更多相关文章

  1. Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)

    887. 鸡蛋掉落 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑. 每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去. 你知道存在楼层 F ,满足 0 < ...

  2. LeetCode887鸡蛋掉落——dp

    题目 题目链接 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N  共有 N 层楼的建筑.每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去,如果没有碎可以继续使用.你知道存在楼层 F , ...

  3. LeetCode 887.鸡蛋掉落(C++)

    每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去. 你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的 ...

  4. [LeetCode] 887. Super Egg Drop 超级鸡蛋掉落

    You are given K eggs, and you have access to a building with N floors from 1 to N.  Each egg is iden ...

  5. 记录Leetcode 鸡蛋掉落 的思路

    前言 首先看一下这个题目,是Leetcode的第887题"鸡蛋掉落": 你将获得 `K` 个鸡蛋,并可以使用一栋从 `1` 到 `N` 共有 `N` 层楼的建筑. 每个蛋的功能都是 ...

  6. dp乱写2:论dp在不在dp中(但在dp范畴)内的应用

    最近正儿八经的学习了dp,有一些题目非常明显看出来就是dp了比如说:过河卒.方格取数.导弹拦截.加分二叉树.炮兵阵地更加明显的还有:采药.装箱问题.过河.金明的预算方案.今天来谈谈dp的dp在不在dp ...

  7. 动态规划——区间DP,计数类DP,数位统计DP

    本博客部分内容参考:<算法竞赛进阶指南> 一.区间DP 划重点: 以前所学过的线性DP一般从初始状态开始,沿着阶段的扩张向某个方向递推,直至计算出目标状态. 区间DP也属于线性DP的一种, ...

  8. hoj 2662 经典状压dp // MyFirst 状压dp

    题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2662 1.引言:用dp解决一个问题的时候很重要的一环就是状态的表示,一般来说,一个数组即可保存状态. ...

  9. 成也DP,败也DP(AFO?)

    不知道想说什么.. 从来没写过博客,markdown什么的也不会,凑合着看一下吧. 初中的时候开始搞OI,学了两个月后普及组爆零就退赛了. 初三直升的时候说每个人都要选竞赛,抱着混一混的心态选了信息, ...

随机推荐

  1. 你想了解的《javaScript语言精粹》(三)

    # javaScript语言精粹  # 第三章 对象 - javaScript 数据类型     1. 基础数据类型         Number String Boolean Undefined N ...

  2. 【Curl】【转】curl用法!

    curl基础用法! www.ruanyifeng.com/blog/2019/09/curl-reference.html

  3. BUUCTF-数据包中的线索 1

    打开题目里面一个pcapng的文件,于是我们拖进wireshark流量分析一波 发现有http的流量,于是我们过滤http 让后追踪http,然后发现base64的编码, 于是我们看到了base64编 ...

  4. spring boot:用rocketmq消息订阅实现删除购物车商品功能(spring boot 2.3.3)

    一,为什么要使用消息队列实现删除购物车商品功能? 消息队列主要用来处理不需要立刻返回结果的业务, 常见的例子: 用户在下单后,要清除原购物车中的商品, 这个处理过程不需要马上实现也不需要返回结果给用户 ...

  5. centos8平台用ss监控网络

    一,ss所属的包: [root@blog ~]# whereis ss ss: /usr/sbin/ss /usr/share/man/man8/ss.8.gz [root@blog ~]# rpm ...

  6. 第四章 Bash Shell 的简单应用

    一.Bash Shell 的简单介绍 1.什么是bash shell? 是一个命令解释器 它在操作系统的最外面 负责用户与内核进行交互的一种接口 将用户输入的命令翻译给操作系统,并将处理后的结果输出到 ...

  7. 【应用服务 App Service】当使用EntityFrameWorkCore访问Sql Server数据库时,在Azure App Service会出现Cannot create a DbSet for ** because this type is not included in the model for the context的错误

    问题情形 使用EF Core访问数据库,在本地运行正常,发布到App Service后,偶尔出现了Cannot create a DbSet for ** because this type is n ...

  8. springboot入门系列(四):SpringBoot和Mybatis配置多数据源连接多个数据库

    SpringBoot和Mybatis配置多数据源连接多个数据库 目前业界操作数据库的框架一般是 Mybatis,但在很多业务场景下,我们需要在一个工程里配置多个数据源来实现业务逻辑.在SpringBo ...

  9. 微信小程序分类的实现

    微信小程序的分类功能思路 实现思路 1.把屏幕当成一个固定的盒子,然后把盒子分成两边,并让盒子的每一边都能够滚动. 2.通过将左侧边栏元素的id和右边内容的categoryId进行匹配,渲染展示相同i ...

  10. CTF相关

    https://blog.csdn.net/zxl2016/article/details/96482763