香槟塔
我们把玻璃杯摆成金字塔的形状,其中第一层有1个玻璃杯,第二层有2个,依次类推到第100层,每个玻璃杯(250ml)将盛有香槟。
从顶层的第一个玻璃杯开始倾倒一些香槟,当顶层的杯子满了,任何溢出的香槟都会立刻等流量的流向左右两侧的玻璃杯。当左右两边的杯子也满了,就会等流量的流向它们左右两边的杯子,依次类推。(当最底层的玻璃杯满了,香槟会流到地板上)
例如,在倾倒一杯香槟后,最顶层的玻璃杯满了。倾倒了两杯香槟后,第二层的两个玻璃杯各自盛放一半的香槟。在倒三杯香槟后,第二层的香槟满了 - 此时总共有三个满的玻璃杯。在倒第四杯后,第三层中间的玻璃杯盛放了一半的香槟,他两边的玻璃杯各自盛放了四分之一的香槟,如下图所示。
在这里,因为每层的最左边和最右边其实每次只能得到上面一个杯子的流量。因此在这个过程中,为了处理边界的问题,把数组扩大。相当于给数组的最左边加一列全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];}
};
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态