leecode.799. 香槟塔

 2023-09-07 阅读 32 评论 0

摘要:题目 香槟塔 我们把玻璃杯摆成金字塔的形状,其中第一层有1个玻璃杯,第二层有2个,依次类推到第100层,每个玻璃杯(250ml)将盛有香槟。 从顶层的第一个玻璃杯开始倾倒一些香槟,当顶层的杯子满了,任何溢出的香槟都会立刻等流量的流向左

题目

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

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

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

思路分析

  • 使用一个dp数组来存储现存的香槟。如果当前值大于1,说明本层的香槟会流到下层。模拟这个过程。

注意点

在这里,因为每层的最左边和最右边其实每次只能得到上面一个杯子的流量。因此在这个过程中,为了处理边界的问题,把数组扩大。相当于给数组的最左边加一列全0。那么对于A[i][j],其左边的杯子是A[i - 1][j-1],其右边的杯子是A[i - 1][j],这样在左边加了一列全0的向量之后,就不用额外处理边界问题了

代码

在这里插入代码片class Solution {
public:double champagneTower(int poured, int query_row, int query_glass) {double dp[105][105] = {0.0};dp[0][1] = poured;for(int i = 1;i <= query_row;i++){for(int j = 1;j <= i + 1;j++){double l = (dp[i - 1][j - 1] - 1) / 2;double r = (dp[i - 1][j] - 1) / 2;if(l > 0) dp[i][j] += l;if(r > 0) dp[i][j] += r;}}if(dp[query_row][query_glass + 1] > 1) return 1;else return dp[query_row][query_glass + 1];}
};

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/19473.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息