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. 移动吉比特H2-2光猫超级用户与密码

    移动吉比特H2-2光猫超级用户与密码 超级用户名CMCCAdmin 密码aDm8H%MdA----------------版权声明:本文为CSDN博主「BenSon.Album」的原创文章,遵循CC ...

  2. pytest文档55-plugins插件开发

    前言 前面一篇已经学会了使用hook函数改变pytest运行的结果,代码写在conftest.py文件,实际上就是本地的插件了. 当有一天你公司的小伙伴觉得你写的还不错,或者更多的小伙伴想要你这个功能 ...

  3. kibana-安装-通过docker

      拉取镜像 docker pull kibana:7.9.1   创建用户自定义网络 docker network create esnet   运行Kibana docker run --name ...

  4. logstash -grok插件语法介绍

      介绍 logstash拥有丰富的filter插件,它们扩展了进入过滤器的原始数据,进行复杂的逻辑处理,甚至可以无中生有的添加新的 logstash 事件到后续的流程中去!Grok 是 Logsta ...

  5. centOS7永久关闭防火墙(防火墙的基本使用(转)

    查看防火墙状态: systemctl status firewalld.service 如图 绿的running表示防火墙开启 执行关闭命令: systemctl stop firewalld.ser ...

  6. mac 解决安卓模拟器链接不上网络

    方法1.临时方法,每次启动都要加114.114.114.114 1.进入到下面的目录 /Users/anxiaodong/Library/Android/sdk/emulator 2.执行以下命令 e ...

  7. Topsis优劣解距离法 mlx代码

    请参考https://blog.csdn.net/qq_36384657/article/details/98188769 mlx代码 topsis 优劣解距离法 参数说明: 分数.获奖次数.价值等 ...

  8. EFS加密

    目录 EFS简介 EFS的特点 EFS的缺陷 EFS证书 证书的导出 证书的安装 EFS加密 方法一 方法二 EFS简介 EFS(Encrypting File System,加密文件系统)是Wind ...

  9. D. Concatenated Multiples 解析(思維)

    Codeforce 1029 D. Concatenated Multiples 解析(思維) 今天我們來看看CF1029D 題目連結 題目 給你一個序列\(a\)和一個數字\(k\),求有幾種ind ...

  10. day78:luffy:前端对于token的认证&滑动验证码的实现

    目录 1.前端对于token的认证 2.滑动验证码 1.滑动验证码实现的原理 2.滑动验证码的代码实现 1.配置文件 2.前端实现:Login.vue 3.后端实现:改写jwt代码 1.前端对于tok ...