一、题目

我们把玻璃杯摆成金字塔的形状,其中 第一层 有 1 个玻璃杯, 第二层 有 2 个,依次类推到第 100 层,每个玻璃杯 (250ml) 将盛有香槟。

从顶层的第一个玻璃杯开始倾倒一些香槟,当顶层的杯子满了,任何溢出的香槟都会立刻等流量的流向左右两侧的玻璃杯。当左右两边的杯子也满了,就会等流量的流向它们左右两边的杯子,依次类推。(当最底层的玻璃杯满了,香槟会流到地板上)

【例如】在倾倒一杯香槟后,最顶层的玻璃杯满了。倾倒了两杯香槟后,第二层的两个玻璃杯各自盛放一半的香槟。在倒三杯香槟后,第二层的香槟满了 - 此时总共有三个满的玻璃杯。在倒第四杯后,第三层中间的玻璃杯盛放了一半的香槟,他两边的玻璃杯各自盛放了四分之一的香槟,如下图所示。

现在当倾倒了非负整数杯香槟后,返回第 i 行 j 个玻璃杯所盛放的香槟占玻璃杯容积的比例( i 和 j 都从0开始)。

二、示例

2.1> 示例 1:

【输入】 poured(倾倒香槟总杯数) = 1, query_glass(杯子的位置数) = 1, query_row(行数) = 1
【输出】 0.00000
【解释】 我们在顶层(下标是(0,0))倒了一杯香槟后,没有溢出,因此所有在顶层以下的玻璃杯都是空的。

2.2> 示例 2:

【输入】 poured(倾倒香槟总杯数) = 2, query_glass(杯子的位置数) = 1, query_row(行数) = 1
【输出】 0.50000
【解释】 我们在顶层(下标是(0,0)倒了两杯香槟后,有一杯量的香槟将从顶层溢出,位于(1,0)的玻璃杯和(1,1)的玻璃杯平分了这一杯香槟,所以每个玻璃杯有一半的香槟。

2.3> 示例 3:

【输入】 poured = 100000009, query_row = 33, query_glass = 17
【输出】 1.00000

提示:

  • 0 <= poured <= 10^9
  • 0 <= query_glass <= query_row < 100

三、解题思路

4.1> 采用二维dp[][]计算

我们创建一个二维数组dp[i][j],其中,i表示行号,j表示酒杯编号。

根据题目描述,我们可以知道,针对于第row行第column列(dp[row][column])的这个酒杯,有机会能够注入到它的“上层”酒杯只会是dp[row-1][column-1]dp[row-1][column],那么这里是“有机会”,因为只有这两个酒杯都满了(减1)的情况下,才会注入到dp[row][column]这个酒杯中,所以,我们可以得到状态转移方程为:

dp[row][column] = Math.max(dp[row - 1][column - 1] - 1, 0) / 2 + Math.max(dp[row - 1][column] - 1, 0) / 2

那么我们从第一行开始计算,逐一可以计算出每一行中每一个酒杯的容量,那么题目的结果就显而易见了。具体操作,如下图所示:

4.2> 采用一维dp[]计算

由于题目只需要获取第query_row行的第query_glass编号的酒杯容量,那么我们其实只需要关注第query_row行的酒杯容量即可,所以,用一维数组dp[]来保存最新计算的那个行中每个酒杯的容量。

计算方式与上面的解法相似,此处就不赘述了。

四、代码实现

4.1> 采用二维dp[][]计算

class Solution {public double champagneTower(int poured, int query_row, int query_glass) {double[][] dp = new double[query_row + 2][query_row + 2];dp[1][1] = poured; // 为了方式越界,下标(0,0)的酒杯我们存放在dp[1][1]的位置上for (int row = 2; row <= query_row + 1; row++) {for (int column = 1; column <= row; column++) {dp[row][column] = Math.max(dp[row - 1][column - 1] - 1, 0) / 2 + Math.max(dp[row - 1][column] - 1, 0) / 2;}}return Math.min(dp[query_row + 1][query_glass + 1], 1);}
}

4.2> 采用一维dp[]计算

class Solution {public double champagneTower(int poured, int query_row, int query_glass) {double[] dp = new double[query_glass + 2]; // 第i层中每个glass的容量dp[0] = poured; // 第0层的第0个编号酒杯倾倒香槟容量int row = 0;while (row < query_row) { // 获取第query_row行,只需要遍历到第query_row减1行即可。for (int glass = Math.min(row, query_glass); glass >= 0; glass--) { double overflow = Math.max(dp[glass] - 1, 0) / 2.0;dp[glass] = overflow; // 覆盖掉旧值dp[glass + 1] += overflow; // 由于是倒序遍历,所以对于dp[glass + 1]要执行“+=”操作}row++; // 计算下一行}return Math.min(dp[query_glass], 1); // 如果倾倒香槟容量大于1,则只返回1.}
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

图解LeetCode——799. 香槟塔(难度:中等)相关推荐

  1. Java实现 LeetCode 799 香槟塔 (暴力模拟)

    799. 香槟塔 我们把玻璃杯摆成金字塔的形状,其中第一层有1个玻璃杯,第二层有2个,依次类推到第100层,每个玻璃杯(250ml)将盛有香槟. 从顶层的第一个玻璃杯开始倾倒一些香槟,当顶层的杯子满了 ...

  2. Leetcode 799. 香槟塔

    我们把玻璃杯摆成金字塔的形状,其中第一层有1个玻璃杯,第二层有2个,依次类推到第100层,每个玻璃杯(250ml)将盛有香槟. 从顶层的第一个玻璃杯开始倾倒一些香槟,当顶层的杯子满了,任何溢出的香槟都 ...

  3. LeetCode 799. 香槟塔(DP动态规划)

    文章目录 1. 题目 2. 解题 1. 题目 我们把玻璃杯摆成金字塔的形状,其中第一层有1个玻璃杯,第二层有2个,依次类推到第100层,每个玻璃杯(250ml)将盛有香槟. 从顶层的第一个玻璃杯开始倾 ...

  4. 力扣(LeetCode)799. 香槟塔(C++)

    动态规划 设 iii 是行 , jjj 是列 , f[i][j]f[i][j]f[i][j] 表示经过杯子的酒量 ,初始 f[0][0]=pouredf[0][0]=pouredf[0][0]=pou ...

  5. 799. 香槟塔 : 简单线性 DP 运用题

    题目描述 这是 LeetCode 上的 799. 香槟塔 ,难度为 中等. Tag : 「动态规划」.「线性 DP」 我们把玻璃杯摆成金字塔的形状,其中 第一层 有 1 个玻璃杯, 第二层 有 2 个 ...

  6. leecode.799. 香槟塔

    题目 香槟塔 我们把玻璃杯摆成金字塔的形状,其中第一层有1个玻璃杯,第二层有2个,依次类推到第100层,每个玻璃杯(250ml)将盛有香槟. 从顶层的第一个玻璃杯开始倾倒一些香槟,当顶层的杯子满了,任 ...

  7. 【LeetCode每日一题:799.香槟塔~~~模拟】

    题目描述 我们把玻璃杯摆成金字塔的形状,其中 第一层 有 1 个玻璃杯, 第二层 有 2 个,依次类推到第 100 层,每个玻璃杯 (250ml) 将盛有香槟. 从顶层的第一个玻璃杯开始倾倒一些香槟, ...

  8. 【799. 香槟塔】

    来源:力扣(LeetCode) 描述: 我们把玻璃杯摆成金字塔的形状,其中 第一层 有 1 个玻璃杯, 第二层 有 2 个,依次类推到第 100 层,每个玻璃杯 (250ml) 将盛有香槟. 从顶层的 ...

  9. 799. 香槟塔 ----- 动态规划、模拟、逆向

    我们把玻璃杯摆成金字塔的形状,其中 第一层 有 1 个玻璃杯, 第二层 有 2 个,依次类推到第 100 层,每个玻璃杯 (250ml) 将盛有香槟. 从顶层的第一个玻璃杯开始倾倒一些香槟,当顶层的杯 ...

最新文章

  1. 习题2-5 求平方根序列前N项和 (15 分)
  2. python中元组_理解python中的元组
  3. uva 10559——Blocks
  4. Nginx For Windows 关于 worker_connections 不生效问题
  5. linux curl 命令(转)
  6. 详细解读 | CVPR 2021轻量化目标检测模型MobileDets(附论文下载)
  7. Extjs6开发环境搭建
  8. 计算机网络回顾之计算机网络概述
  9. 仪电电子“结盟”复旦大数据学院
  10. mevan 的常用命令和参数解释
  11. C++在使用fgetc读取文件时出现方框乱码
  12. 水准测量的各种数字考点
  13. 计算机蓝屏安全模式都启动不了,stop:0x00000074蓝屏无法进入安全模式无法开机 解决办法...
  14. Dynamics 365(on-premises)公告栏报错
  15. 基于STM32和阿里云的环境检测系统设计
  16. 51单片机实战教程(六 网线测试治具设计)
  17. android黑盒子调用,[原创]Android群控黑盒调用 - Sekiro食用手册
  18. 读《区块链革命 》有感
  19. GROMACS 分子模拟使用
  20. 宿舍管理系统第一周项目记录

热门文章

  1. 在线工具合集 工作效率分分钟翻倍!
  2. 手机页面底部浮动的按钮
  3. 少儿编程学霸孩子必备的三种思维,编程思维的速成方法
  4. 2019年个人提升计划
  5. EasyEclipse for PHP运行PHP文件(关于PHP Browser的配置)
  6. sql的行转列(PIVOT)与列转行(UNPIVOT)
  7. 在MTK6572当中如何增加一个新按键,而且此按键值在虚拟按键当中可以使用
  8. Oracle数据库备份常用方法
  9. mysql四表统计数量:统计中国各个省份安装企业站点数量
  10. 一个程序员的诗集【现代诗篇】