剑指 Offer 60. n个骰子的点数
题目描述
把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。
class Solution:
def dicesProbability(self, n: int) -> List[float]:
L = [[0]* 6 * n for _ in range(n + 1)]
for j in range(6):
L[1][j] = 1
for i in range(2, n + 1):
for j in range(i - 1, 6 * i):
for k in range(6):
L[i][j] += L[i - 1][j - k - 1]
s = 6 ** n
return [ i/s for i in L[n] if i > 0]
动态规划:
转移 f[n][s]=∑i=16f[n−1][s−i]f[n][s] = \sum_{i=1}^{6}f[n-1][s-i]f[n][s]=∑i=16f[n−1][s−i]
每个 i 上限为6 * i, 下限为 i,总数为 6^n
该博客讨论了如何使用动态规划算法来计算n个骰子投掷后所有可能点数出现的概率。给出的解决方案中,`dicesProbability` 函数通过递归地填充二维数组 `L` 来计算每种点数组合的概率,并最终返回一个浮点数数组,表示每种点数的概率值。动态规划公式为 f[n][s]=∑i=16f[n−1][s−i],其中 f[n][s] 表示 n 个骰子掷出点数 s 的概率。
743

被折叠的 条评论
为什么被折叠?



