当前位置: 首页 > web >正文

[概率 DP]808. 分汤

808. 分汤

808. 分汤 - 力扣(LeetCode)

二、寻找子问题


定义目标事件:汤 A 先于 B 耗尽,或者两种汤在同一回合耗尽(此时只计一半的权重)。

比如 n=200:

从汤 A 取 100 毫升,从汤 B 取 0 毫升。问题变成两种汤的剩余量分别为 100 毫升和 200 毫升时,目标事件发生的概率。
从汤 A 取 75 毫升,从汤 B 取 25 毫升。问题变成两种汤的剩余量分别为 125 毫升和 175 毫升时,目标事件发生的概率。
从汤 A 取 50 毫升,从汤 B 取 50 毫升。问题变成两种汤的剩余量分别为 150 毫升和 150 毫升时,目标事件发生的概率。
从汤 A 取 25 毫升,从汤 B 取 75 毫升。问题变成两种汤的剩余量分别为 175 毫升和 125 毫升时,目标事件发生的概率。
这些问题都是和原问题相似的、规模更小的子问题,可以用递归解决。

三、状态定义与状态转移方程


根据「寻找子问题」,定义 dfs(a,b) 表示两种汤的剩余量分别为 a 毫升和 b 毫升时,目标事件发生的概率。

在当前回合,我们等概率地选择以下四种操作中的一种执行:

从汤 A 取 100 毫升,从汤 B 取 0 毫升。问题变成两种汤的剩余量分别为 a−100 毫升和 b 毫升时,目标事件发生的概率,即 dfs(a−100,b)。
从汤 A 取 75 毫升,从汤 B 取 25 毫升。问题变成两种汤的剩余量分别为 a−75 毫升和 b−25 毫升时,目标事件发生的概率,即 dfs(a−75,b−25)。
从汤 A 取 50 毫升,从汤 B 取 50 毫升。问题变成两种汤的剩余量分别为 a−50 毫升和 b−50 毫升时,目标事件发生的概率,即 dfs(a−50,b−50)。
从汤 A 取 25 毫升,从汤 B 取 75 毫升。问题变成两种汤的剩余量分别为 a−25 毫升和 b−75 毫升时,目标事件发生的概率,即 dfs(a−25,b−75)。
在当前回合,上述四种操作互斥且等概率地被选择,因此目标事件发生的概率为四个后续状态值的平均值,即

dfs(a,b)=41​[dfs(a−100,b)+dfs(a−75,b−25)+dfs(a−50,b−50)+dfs(a−25,b−75)]

递归边界:

四、递归搜索 + 保存递归返回值 = 记忆化搜索


执行一次操作 2 和一次操作 4,会让 a 和 b 均减少 100;执行两次操作 3,也会让 a 和 b 均减少 100。这两种方式都会递归到 dfs(a−100,b−100),这会导致我们重复计算同一个状态。

考虑到整个递归过程中有大量重复递归调用(递归入参相同)。由于递归函数没有副作用,同样的入参无论计算多少次,算出来的结果都是一样的,因此可以用记忆化搜索来优化:

如果一个状态(递归入参)是第一次遇到,那么可以在返回前,把状态及其结果记到一个 memo 数组中。
如果一个状态不是第一次遇到(memo 中保存的结果不等于 memo 的初始值),那么可以直接返回 memo 中保存的结果。

class Solution:def soupServings(self, n: int) -> float:if  n >= 4451:return 1@cachedef dfs(a,b):if a<=0 and b <= 0:return 0.5if a <= 0:return 1.0if b <= 0:return 0.0return (dfs(a-100,b)+dfs(a-75,b-25)+dfs(a-50,b-50)+dfs(a-25,b-75))/4return dfs(n,n)

http://www.xdnf.cn/news/17553.html

相关文章:

  • 第4章 程序段的反复执行2 while语句P128练习题(题及答案)
  • pytorch llm 计算flops和参数量
  • Gltf 模型 加载到 Cesium 的坐标轴映射浅谈
  • 深入理解C++构造函数与初始化列表
  • Python训练营打卡Day27-类的定义和方法
  • AudioLLM
  • 专题二_滑动窗口_找到字符串中所有字母异位词
  • 第二十天:数论度量
  • 前端Web在Vue中的知识详解
  • 数据溢出ERROR L107:ADDRESS SPACE OVERFLOW
  • 11. 为什么要用static关键字
  • 【C++】string 的特性和使用
  • Python(13) -- 面向对象
  • 【面试场景题】通过LinkedHashMap来实现LRU与LFU
  • Java+Vue打造的采购招投标一体化管理系统,涵盖招标、投标、开标、评标全流程,功能完备,附完整可二次开发的源码
  • 标准IO实现
  • Effective C++ 条款32:确定你的public继承塑模出 is-a 关系
  • AWT 基本组件深入浅出:Button/Label/TextField/Checkbox/Choice/List 全面实战与性能优化
  • 2025-08-09 李沐深度学习14——经典卷积神经网络 (2)
  • MySQL相关概念和易错知识点(4)(分组查询、连接查询、合并查询、子查询)
  • Mysql笔记-系统变量\用户变量管理
  • 【LLM实战|langchain】langchain基础
  • toRef和toRefs
  • 智慧城管复杂人流场景下识别准确率↑32%:陌讯多模态感知引擎实战解析
  • Easysearch 冷热架构实战
  • Linux下管道的实现
  • SpringBoot 集成 MapStruct
  • 《从零实现哈希表:详解设计、冲突解决与优化》
  • [激光原理与应用-197]:光学器件 - 图解双折射晶体的工作原理
  • Aurora接口FPGA设计