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

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

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

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

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

注意:

  • poured 的范围[0, 10 ^ 9]
  • query_glass 和query_row 的范围 [0, 99]

在真实的面试中遇到过这道题?

解题思路:

模拟题。先将总数为sum的香槟放入最顶上的杯子,也就是数组下标为[0][0]的地方复制为sum。假设dp[i][j]为数组下标为[i][j]获得的香槟总数,dp[0][0]=sum。

  1. 除dp[0][0]以外,所有值均为0.
  2. 如果sum>1,那么剩余的香槟必然溢出到下一层的[i+1][j]和[i+1][j+1]两个位置。
  3. 根据题意,等流量的条件,dp[i+1][j]+=(dp[i][j]-1)*0.5,dp[i+1][j+1]+=(dp[i][j]-1)*0.5。
  4. 迭代100次必然可以算出所有杯子的状态。

优化:

  1. 由于规模仅有100,所以2维数组也是可以的,因为每次只用到上一层的数据,所以可以简化为一维数组。
  2. 由于题目仅仅需要计算一个位置的状态,可以计算到该层后结束计算,不必每次都计算100层。
  3. 可能在某次计算之后,当前层不会发生溢出状态,则下面的全部是0,不必继续迭代。
C++代码

//未经优化的代码

class Solution {
public:
    double champagneTower(int poured, int query_row, int query_glass) {
        double all = poured;
        double res[100][100] = { 0.0 };
        res[0][0] = all;
        int i, j;
        for (i = 1; i <= 100; i++) {
            for (j = 1; j <= i; j++) {
                if (res[i - 1][j - 1] > 1) {
                    if (i < 100) {
                        res[i][j - 1] += (res[i - 1][j - 1] - 1) / 2;
                        res[i][j]+= (res[i - 1][j - 1] - 1) / 2;
                    }
                    res[i - 1][j - 1] = 1;
                }
            }
        }
        return res[query_row][query_glass];
    }
};

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. 图解LeetCode——799. 香槟塔(难度:中等)

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

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

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

  7. leecode.799. 香槟塔

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

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

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

  9. 【799. 香槟塔】

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

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

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

最新文章

  1. 当年的程序员,如今已是父母,七个方法让孩子爱上学习!
  2. 电脑技巧:如何更改Win10桌面文件路径,轻松给系统盘瘦身!
  3. Hibernate如何存储二级缓存条目
  4. Hibernate教程– ULTIMATE指南(PDF下载)
  5. Java性能调优调查结果(第一部分)
  6. 【Java】输出50-100范围内所有的素数
  7. 【转载】这次拆库 应是微服务化的拆分方式
  8. 工作闲暇-曾经的“伪”前端+切图工作
  9. java集合框架之Collection
  10. 【TP】TP如何向模板中的js传变量
  11. 都说苹果秋季发布会像一杯白开水,那么...
  12. CXF学习创建WebService
  13. JWT实现接口双重认证,提供安全又不复杂的接口安全能力
  14. 亚马逊买家多账号如何运行管理?
  15. 哪一款信用卡累计兑换航空里程最划算?
  16. 《TCP/IP路由技术(第二卷)》一1.2 EGP的操作
  17. Java HashMap的遍历(常用的四种方式),及key,value规律
  18. 2017 Github优秀开源项目整理
  19. 相亲app开发,解决内存循环引用的问题
  20. 智能驾驶系统简介和测试要点分析

热门文章

  1. 设计模式-工厂模式(Factory)
  2. HardFault 异常定位
  3. 仿网易云音乐的YY音乐微信小程序源码
  4. [game]《泰坦陨落2》
  5. 论文笔记《Aspect-Aware Latent Factor Model:Rating Prediction with Ratings and Reviews》
  6. 微博图片设计模板素材推荐 精品 小众
  7. 深度学习研究生常用网站||图像处理||医学影像||使用评价||汇总
  8. IB计算机科学选课,IB体系应如何正确选课?
  9. 网页设计基础知识汇总——超链接
  10. 计算机组装中如何看硬件型号,如何查看主板型号?(三种方法!)