剑指 Offer 60. n个骰子的点数

题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。  中等

你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。

方法:动态规划  时间复杂度O(n)  空间复杂度O(n)  

在已有概率的情况下,再来一个骰子,每个概率被稀释1/6,相同数值加和,就是新的概率

dp[i] 表示i个骰子的概率集合

n个骰子能组合出 5 * n + 1个数字,dp[i - 1]中的每个概率与新加入的一个骰子结合,都会变为原来的1/6

def dicesProbability(self, n):
        """
        :type n: int
        :rtype: List[float]
        """
        dp = [float(1)/6] * 6  # float是python2的原因,默认整型除法//
        for i in range(2,n+1):
            tmp = [0] * (5*i + 1)  # 这里是i,总写错成n
            for j in range(len(dp)):
                for k in range(6):
                    tmp[j + k] += float(dp[j]) * (float(1)/6)
            dp = tmp
        return dp

 

posted @ 2022-08-06 16:04  Liang-ml  阅读(30)  评论(0)    收藏  举报