LeetCode 0799. 香槟塔

news2024/10/5 17:17:54

【LetMeFly】799.香槟塔

力扣题目链接:https://leetcode.cn/problems/champagne-tower/

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

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

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

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

 

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

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

示例 3:

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

 

提示:

  • 0 <= poured <= 109
  • 0 <= query_glass <= query_row < 100

方法一:动态规划

开辟一个大小为 d p [ 100 ] [ 100 ] dp[100][100] dp[100][100]的二维数组

其中 d p [ i ] [ j ] dp[i][j] dp[i][j]代表第 i i i行第 j j j列玻璃杯的香槟接收量(下标从 0 0 0开始)

这样,我们就很容易得到状态转移方程:

d p [ i ] [ j ] = ( d p [ i − 1 ] [ j − 1 ] − 1 ) / 2 + ( d p [ i − 1 ] [ j ] − 1 ) / 2 dp[i][j] = (dp[i - 1][j - 1] - 1) / 2 + (dp[i - 1][j] - 1) / 2 dp[i][j]=(dp[i1][j1]1)/2+(dp[i1][j]1)/2(注意边界条件、是否为负)

也就是说,上层玻璃杯在自己盛满(-1)的情况下,会有一半溢到当前玻璃杯中。

最终返回 d p [ q u e r y r o w ] [ q u e r y g l a s s ] dp[query_row][query_glass] dp[queryrow][queryglass]即为答案。

  • 时间复杂度 O ( q e u r y r o w × q u e r y g l a s s ) O(qeury_row\times query_glass) O(qeuryrow×queryglass)
  • 空间复杂度 O ( q u e r y r o w × q u e r y g l a s s ) O(query_row\times query_glass) O(queryrow×queryglass)(也可以不开辟大小为 100 × 100 100\times100 100×100的空间,而仅仅开辟大小为 q u e r y r o w × q u e r y g l a s s query_row\times query_glass queryrow×queryglass的空间,这样空间复杂度就变成了 q u e r y r o w × q u e r y g l a s s query_row\times query_glass queryrow×queryglass

优化:当前这一层的状态之和上一层有关,因此,我们可以只开辟两个一维数组,只存放当前和上一行的状态。这样空间复杂度就变成了 O ( m a x ( q u e r y r o w , q u e r y g l a s s ) ) O(max(query_row, query_glass)) O(max(queryrow,queryglass))

AC代码

C++

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

运行结果还不错

result

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/127946948

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/20623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

几何算法——介绍

几何算法——介绍介绍1 关于几何引擎介绍2 关于模型的表达2.1 CSG (Constructive Solid Geometry )表示2.2 Brep (Boundary Representation)表示3 关于翼边结构和半边结构3.1 翼边结构3.2 半边结构4 关于边界表示法4.1 ACIS中的Brep表示很早之前就想写一些几何算法相关的文章&a…

一汽大众迈腾车前悬架系统设计

目 录 摘要 I Abstract II 第一章 绪论 1 1.1选题背景及意义 1 1.2国内外的研究现状 1 1.3本文的主要研究内容 3 第二章 悬架的结构分析与整体参数设计 4 2.1悬架系统的简介与分类 4 2.1.1悬架系统的简介 4 2.1.2悬架系统的分类 5 2.2独立悬架的特点 5 2.3整体参数的设计 6 2.3…

VM Tools安装过程

系列文章目录 VM Tools安装过程 VM Tools安装过程系列文章目录一、VM Tools安装步骤二、安装后无法使用问题解决办法之一一、VM Tools安装步骤 此时系统会弹出装载虚拟CD驱动器 点击打开文件 打开文件后可将 文件夹里的文件全部复制到自己的某个文件夹中&#xff0c;比如桌面 注…

延误件如何筛选 物流查询分享查询方法筛选延误三天以上物流件

当你拥有大量快递单号需要查询时&#xff0c;如何快速查询出每个单号的物流信息呢&#xff1f;分析物流更新是否及时&#xff0c;有没有延误&#xff0c;今天小编给大家分享一款软件批量查询物流&#xff0c;并且筛选出延误件&#xff0c;一起来看看吧&#xff01; 第一步&…

Linux进阶-编辑器

常用两个编辑器 gedit编辑器&#xff1a;依赖图形界面。 vi/vim编辑器&#xff1a;sudo apt install vim&#xff08;安装vim编辑器&#xff09; vim与vi的区别&#xff1a; vim是vi的升级版本&#xff0c;兼容vi&#xff1b; vi按u只能撤销上次命令&#xff0c;而在vim里…

QT之OpenGL摄像机

QT之OpenGL摄像机1. 概述1.1 摄像机创建2. 旋转(欧拉角)3. demo示例4. 参考1. 概述 OpenGL本身没有摄像机(Camera)的概念&#xff0c;但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机&#xff0c;产生一种我们在移动的感觉。 当我们讨论摄像机/观察空间…

OpenCV图像处理——(实战)信用卡识别

总目录 图像处理总目录←点击这里 十四、信用卡数字识别 识别的图片模板图片 14.1、模板图片处理 读入图片->灰度图->二值图->计算轮廓->存储每一个模板 如果是所需模板匹配只有一个&#xff0c;课直接读入灰度图像即可 这里有10个模板(0-9)&#xff0c;所以需…

学校教务管理系统的设计与实现--Word文档可在最后链接处下载,无code

一 设计背景 1.1 课题现状 国家经济水平逐渐的提升&#xff0c;各行各业发展也稳步向前&#xff0c;其业务也繁多起来。慢慢的对其管理需求也要求提高&#xff0c;因此很多行业临着新的困难和机遇&#xff0c;现如今要怎么利用利于对自身发展需要的而且适用的种种技术来提升自身…

【PID优化】基于正余弦算法 (SCA)优化PID实现微型机器人系统位置控制附simulink模型和matlab代码

​✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法…

CMake中math的使用

CMake中的math用于评估数学表达式&#xff0c;其格式如下&#xff1a; math(EXPR <variable> "<expression>" [OUTPUT_FORMAT <format>]) 计算数学<expression>并将<variable>设置为结果值。expression的结果必须可以表示为64位有符号…

用python gdal裁剪栅格数据提取添加xy经纬度和栅格值

用python gdal裁剪栅格数据提取添加xy经纬度和栅格值 问题&#xff1a;把遥感影像转为一张表。 现有一全球经济作物数据alfalfa的产量。 alfalfa是一种亚洲西南部多年生草本植物&#xff0c;是重要的经济作物。在图中也可以看到&#xff0c;主要分布在热带和南美洲。 我们想把…

Android PackageManager 基本使用

Android系统为我们提供了很多服务管理类&#xff0c;PackageManager管理类&#xff0c;它的主要职责是管理应用程序包。 通过PackageManager获取的应用程序信息来自AndroidManifest.xml。 AndroidManifest.xml是Android应用程序中最重要的文件之一&#xff0c;它是Android程序…

java语法复习:注解

目录 一.注解概念 二.常用注解(1) Override: 限定某个函数必须重载其他函数&#xff0c;该注解只能用于函数(2) Deprecated&#xff1a;用于表示某个程序元素&#xff08;类、函数&#xff09;已过时(3) SuppressWarnings&#xff1a;抑制编译器警告 三.元注解 一.注解概念 …

山东大学线性代数-2-行列式

目录 2.2 n阶行列式 2.2.1 代数余子式和余子式 2.2.2 n阶行列式的定义 2.3 特殊行列式的计算 2.3.1 对角行列式 2.3.2 三角行列式 2.3.3 斜三角行列式 2.3.4 其他特殊行列式 2.4 行列式的性质 2.4.1 性质1 2.4.2 性质2 2.4.3 性质3 2.4.4 性质4 2.4.5 性质5 2.5 行列…

【笔试题】【day25】

文章目录第一题&#xff08;缺页中断&#xff09;第二题&#xff08;多线程&#xff09;第三题&#xff08;系统死锁的原因&#xff09;第四题&#xff08;大小端在内存中的存储方式&#xff09;第五题&#xff08;处理器运行时间计算&#xff09;第六题&#xff08;计算机的访…

八.STM32F030C8T6 MCU开发之电源掉电检测案例

八.STM32F030C8T6 MCU开发之电源掉电检测案例 0.总体功能概述 使用STD库–en.stm32f0_stdperiph_lib_v1.6.0。 单片机在正常工作时&#xff0c;因某种原因造成突然掉电&#xff0c;将会丢失数据存储器(RAM)里的数据。在某些应用场合如测量、控制等领域&#xff0c;单片机正常…

RedisMysql同步

1. canal Canal&#xff0c;阿里巴巴 MySQL binlog 增量订阅&消费组件&#xff0c;译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费。 首先了解一下mysql主备复制原理&#xff1a;   &#xff08;1&#x…

51单片机计算定时器初值

51单片机计算定时器初值前言理论分析工作方式寄存器 TMODGATE 门控位C/T 计数器模式和定时器模式选择位M1 M0 工作方式选择位定时器/计数器控制寄存器 TCONTCON补充&#xff08;中断相关&#xff09;计算过程补充&#xff1a; 方式2运行原理源码前言 芯片使用AT89S51参考书目《…

Vue2.0开发之——Vue基础用法-列表渲染指令(24)

一 概述 列表渲染指令v-forv-for 中的索引使用 key 维护列表的状态key 的注意事项 二 列表渲染指令v-for 2.1 概念 vue 提供了 v-for 列表渲染指令&#xff0c;用来辅助开发者基于一个数组来循环渲染一个列表结构。v-for 指令需要使 用 item in items 形式的特殊语法&#x…

C#程序发布时,一定要好好地保护,不然你会后悔的

上次分享一个C#混淆开源项目《一个对C#程序混淆加密&#xff0c;小巧但够用的小工具》&#xff0c;发现大家都非常感兴趣&#xff0c;但也发现很多人&#xff0c;不了解为什么没有混淆&#xff0c;就会很容易被破解。 所以今天给大家做一个教程&#xff1a;如何通过工具来反编…