摇骰子的胜利概率| 豆包MarsCode AI刷题

85 阅读3分钟

问题描述

小U和小S正在玩一个有趣的骰子游戏。每个骰子都有固定数量的面数k,每一面的点数分别是1到k。小U拥有n个骰子,每个骰子i的面数是 a_i,摇到每一面的概率均为 1/a_i。小S则有m个骰子,每个骰子j的面数是 b_j,摇到每一面的概率均为 1/b_j

两人分别同时摇各自的骰子,并将摇出的点数相加,得分较高的一方获胜,得分相同则为平局。游戏只进行一次,没有重赛。现在小U想知道他获胜的概率是多少。你能帮他计算吗?(答案保留三位小数)

输入:

  • n:小U的骰子数量
  • m:小S的骰子数量
  • arrayN:小U的每个骰子面数
  • arrayM:小S的每个骰子面数

约束条件:

  • nmk为整数,数据范围 1 ≤ nmk ≤ 25

问题理解

小U和小S分别有不同数量的骰子,每个骰子有不同的面数。我们需要计算小U获胜的概率。

数据结构选择

  1. 骰子点数范围:每个骰子的点数范围是1到其面数。
  2. 总点数范围:由于骰子数量和面数都不大(最多25个骰子,每个骰子最多25面),我们可以计算出所有可能的总点数范围。

算法步骤

  1. 计算所有可能的总点数

    • 对于小U,计算所有可能的总点数及其对应的概率。
    • 对于小S,同样计算所有可能的总点数及其对应的概率。
  2. 计算小U获胜的概率

    • 遍历小U的所有可能总点数,对于每个总点数,计算小S总点数小于该值的概率。
    • 将这些概率相加,得到小U获胜的总概率。

具体步骤

  1. 生成所有可能的总点数及其概率

    • 使用动态规划或递归方法生成所有可能的总点数及其对应的概率。
  2. 计算小U获胜的概率

    • 对于小U的每个可能总点数,计算小S总点数小于该值的概率。
    • 将这些概率相加,得到最终结果。

代码提示

  1. 初始化动态规划数组

    • 创建两个二维数组 dpU 和 dpS,分别用于存储小U和小S在不同骰子数量和总得分下的概率。
  2. 初始化第一个骰子的概率分布

    • 对于第一个骰子,初始化其所有可能得分及其概率。
  3. 动态规划转移

    • 对于每个骰子,计算其所有可能得分及其概率,并更新 dp 数组。
  4. 计算小U获胜的概率

    • 遍历小U的所有可能总点数,对于每个总点数,计算小S总点数小于该值的概率。
    • 将这些概率相加,得到小U获胜的总概率。

代码框架

1732809389846.png 1732809426204.png

解释

  1. 初始化动态规划数组

    • dpU 和 dpS 数组分别记录小U和小S在不同骰子数量和总得分下的概率。
    • max_score_U 和 max_score_S 分别表示小U和小S可能的最大总得分。
  2. 初始化第一个骰子的概率分布

    • dpU[0][0] 和 dpS[0][0] 初始化为1.0,表示没有骰子时得分为0的概率为1。
  3. 动态规划转移

    • 对于每个骰子,计算其所有可能得分及其概率,并更新 dp 数组。
  4. 计算小U获胜的概率

    • 遍历小U的所有可能总点数,对于每个总点数,计算小S总点数小于该值的概率。
    • 将这些概率相加,得到小U获胜的总概率。

总结

通过上述步骤,我们可以计算出小U获胜的概率。关键在于生成所有可能的总点数及其对应的概率,并计算小U获胜的概率。