题目:
思路+代码:
思路:
动态规划,总可能出现情况6n
初始状态:n=1, 1,2,3,4,5,6;六种情况
转移方程:第n次掷色子后的s值,F(n,s) = F(n-1,s-1)+F(n-1,s-2)+F(n-1,s-3)+F(n-1,s-4)+F(n-1,s-5)+F(n-1,s-6);
返回:第n次后,出现各值得情况次数 * 1/(6n)
时间复杂度:O(n2)
空间复杂度:O(n2); 初始化一个n*(6n)的0数组
class Solution:
def twoSum(self, n: int) -> List[float]:
# 思路:动态规划,总可能出现情况6**n
# 初始状态:n=1, 1,2,3,4,5,6;六种情况
# 转移方程:第n次掷色子后的s值,F(n,s) = F(n-1,s-1)+F(n-1,s-2)+F(n-1,s-3)+F(n-1,s-4)+F(n-1,s-5)+F(n-1,s-6);
# 返回:第n次后,出现各值得情况次数 * 1/(6**n)
# 时间复杂度:O(n)
# 空间复杂度:O(n**2); 初始化一个n*(6n)的0数组
dp = [ [0 for _ in range(6*n+1)] for _ in range(n+1)]
for i in range(1,7): # 初始状态,第一次掷色子
dp[1][i] = 1
for i in range(2,n+1): # 第2次到第n次掷色子
for j in range(i,i*6+1): # 第i次掷色子 求和后的 下限值i, 和上限值 i*6+1
for k in range(1,7): # 当前值只能由前一次值基础上 6种可能得来
if j >= k+1:
dp[i][j] +=dp[i-1][j-k]
res = []
for i in range(n,n*6+1): # 返回:第n次后,出现各值得情况次数 * 1/(6**n)
res.append(dp[n][i]*1.0/6**n)
return res