动态规划


设 iii 是行 , jjj 是列 , f[i][j]f[i][j]f[i][j] 表示经过杯子的酒量 ,初始 f[0][0]=pouredf[0][0]=pouredf[0][0]=poured , 为了理解,当做每个杯子有无限容量。
当香槟溢出时,f[i][j]f[i][j]f[i][j] 保留自己的一杯 , 则有 f[i][j]−1f[i][j] -1f[i][j]−1 杯流到下一层 ,均分到 f[i+1][j]f[i+1][j]f[i+1][j] 和 f[i+1][j+1]f[i+1][j+1]f[i+1][j+1] , 有状态转移方程

{f[i+1][j]=(f[i][j]−1)/2f[i+1][j+1]=(f[i][j]−1)/2\begin{cases} {f[i+1][j] = (f[i][j]-1)/2} \\ {f[i+1][j+1] = (f[i][j]-1)/2} \end{cases}{f[i+1][j]=(f[i][j]−1)/2f[i+1][j+1]=(f[i][j]−1)/2​

朴素dp

class Solution {public:double champagneTower(int poured, int query_row, int query_glass) {vector<vector<double>> f(query_row+1,vector<double>(query_row+1)) ;f[0][0] = (double)poured;//假设酒杯容量无限for(int i = 0;i<query_row;i++){for(int j = 0;j<=i;j++){if(f[i][j]>1){//大于1杯,溢出f[i+1][j] += (f[i][j]-1)/2;f[i+1][j+1] += (f[i][j]-1)/2;}}}return min(1.0,f[query_row][query_glass]);}
};

时间复杂度 O(n2)O(n^2)O(n2) , nnn 是 query_rowquery\_rowquery_row 的长度 , 状态转移的时间复杂度 O(n2)O(n^2)O(n2) 。

空间复杂度 O(n2)O(n^2)O(n2) , fff 数组的空间复杂度 O(n2)O(n^2)O(n2) 。

优化dp

由于每一行的香槟只与上一行有关,可以省略状态转移方程的第 111 维 , 又因为与上一行的最多两个状态有关, 用滚动数组保存上一行的状态。

class Solution {public:double champagneTower(int poured, int query_row, int query_glass) {vector<double> f{(double)poured};for(int i = 0;i<query_row;i++){vector<double> nextf(i+2);//上一行有(i+1)个杯子,下一行比上一行多1个杯子for(int j = 0;j<i+1;j++){//下一行比上一行多1个杯子。if(f[j]>1){nextf[j] += (f[j]-1)/2;nextf[j+1] += (f[j]-1)/2;}}f = nextf;//保存上一行的杯子酒量}return min(1.0,f[query_glass]);}
};

时间复杂度 O(n2)O(n^2)O(n2) , nnn 是 query_rowquery\_rowquery_row 的长度 , 状态转移的时间复杂度 O(n2)O(n^2)O(n2) 。

空间复杂度 O(n)O(n)O(n) , 滚动数组的空间复杂度 O(n)O(n)O(n) 。

博主致语

理解思路很重要!
欢迎读者在评论区留言,作为日更博主,看到就会回复的。

AC


力扣(LeetCode)799. 香槟塔(C++)相关推荐

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

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

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

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

  3. Leetcode 799. 香槟塔

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

  4. 图解LeetCode——799. 香槟塔(难度:中等)

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

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

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

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

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

  7. 力扣(LeetCode)刷题,简单+中等题(第35期)

    力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升. 第1题:解码异或后的排列 试题要求如下: 回答(C语言): /*** Note: ...

  8. 力扣(LeetCode)刷题,简单+中等题(第34期)

    目录 第1题:整数转罗马数字 第2题:电话号码的字母组合 第3题:二叉树的所有路径 第4题:砖墙 第5题:下一个排列 第6题:括号生成 第7题:删除并获得点数 第8题:全排列 第9题:颜色分类 第10 ...

  9. 力扣(LeetCode)刷题,简单+中等题(第33期)

    目录 第1题:Z 字形变换 第2题:删除字符串中的所有相邻重复项 第3题:基本计算器 II 第4题:螺旋矩阵 第5题:螺旋矩阵 II 第6题:盛最多水的容器 第7题:删除有序数组中的重复项 II 第8 ...

最新文章

  1. 关于举办第十七届全国大学生智能汽车竞赛的通知-加盖公章
  2. matlab学习记录之基本操作整理
  3. html and js 的隔行换背景色表格实例详解
  4. 一道面试题引发的对JavaScript类型转换的思考
  5. iscroll5 上拉,下拉 加载数据
  6. 洛谷 P1091 合唱队型
  7. 918国际导航网V4.2版整站源码
  8. 3D开发-AR.js 自定义Marker
  9. 小怪掉落碎片及下级符文(灵晶)一览
  10. 【UAC】Windows UAC 原理浅析
  11. java语音api_java – 语音识别Api
  12. 如何在毕业论文Word中插入图表目录
  13. 用循环写出九九乘法表格。
  14. 基础实验5-2.2 电话聊天狂人(Map的使用+例题)
  15. Mos结电容Cgd、Cgs、Cds与分布参数Ciss、Crss、Coss
  16. 通过ffmpeg实时读取宇视摄像头的高清帧流数据,并保存4张图片进行4合一照片的生成。
  17. springboot热启动与热部署
  18. 免费使用chatgpt的网站集合:
  19. 视频点播服务器的配置如何选择,需要多大的带宽
  20. ubuntu18.04安装openvino2022.1

热门文章

  1. 微软认证考试70-461 Modify Data 数据修改 --24%比重--(1)
  2. 一道数量遗传学题:如何计算育种值
  3. Windows 10 延迟更新
  4. php答题闯关游戏,陌陌新上线“答题闯关”对战小游戏 涨知识得现金红包
  5. 书论80 阮元《南北书派论》
  6. 软件最后一步------打包
  7. item在C语言中是什么意思中文,item的中文翻译是什么意思
  8. jieba分词 词性表
  9. 【c++类和对象——设计一个学生类】
  10. 计算机病毒和恶意软件有哪些,恶意软件上常见的病毒有哪些