剑指 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
=
1
6
f
[
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