from typing import List
class Solution:
def dicesProbability(self, n: int) -> List[float]:
end = 6 * n + 1
dp = [[0] * 67 for i in range(12)] # 表示i个骰子掷出s点的次数
for i in range(1, 7):
dp[1][i] = 1 # 表示一个骰子掷出i点的次数为1
for i in range(2, n + 1): # 表示骰子的个数
for s in range(i, end): # 表示可能会出现的总点数
for k in range(1, 7): # 表示当前这个骰子可能掷出的点数
diff = s - k # diff表示总点数减去当前骰子的点数后剩余的(n-1)枚骰子的点数之和
if diff < i - 1: # (i - 1)表示(i - 1)枚骰子的最小总点数,"diff < i - 1"这种情况是不存在的
break
dp[i][s] += dp[i - 1][diff] # 当前n个骰子出现的点数之和等于前一次出现的点数之和加上这一次出现的点数
from math import pow
total = pow(6, n) # 掷出n次点数出现的所有情况
for i in range(n, end):
dp[n][i] = round(dp[n][i] / total, 5) # 第i小的点数出现的概率
return dp[n][n:end]
if __name__ == '__main__':
solution = Solution_()
# n = 1
n = 2
res = solution.dicesProbability(n)
print(res)
from typing import List
class Solution:
def dicesProbability(self, n: int) -> List[float]:
end = 6 * n + 1
dp = [0] * 67 # 表示i个骰子掷出s点的次数
for i in range(1, 7):
dp[i] = 1 # 表示一个骰子掷出i点的次数为1
for i in range(2, n + 1):
for s in range(6 * n, i - 1, -1): # 从后往前更新
for k in range(1, 7):
diff = s - k
if diff < i - 1:
break
dp[s] += dp[diff]
from math import pow
total = pow(6, n) # 掷出n次点数出现的所有情况
for i in range(n, end):
dp[i] = round(dp[i] / total, 5) # 第i小的点数出现的概率
return dp[n:end]
if __name__ == '__main__':
solution = Solution()
# n = 1
n = 2
res = solution.dicesProbability(n)
print(res)
[参考]
解析来源于该文章
代码注释来源于该文章