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

题目描述

把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。

示例 1:

输入: 1
输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]
示例 2:

输入: 2
输出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111,0.08333,0.05556,0.02778]

限制:
1 <= n <= 11

链接:https://leetcode-cn.com/problems/nge-tou-zi-de-dian-shu-lcof

解题思路

使用暴力法的时间复杂度为O(6^n),因此只能通过找规律,使用dp来递推求解。
定义dp[n][i]为扔第n次的时候,和为i的时候的概率。dp[n]中,和的种类的数量为5 * n + 1。
当n为1的时候,dp[0]为[1/6] * 6。

随后开始递推:

注:本题目可以优化为一位数组,即dp[n]为根据之前的dp计算出的tmp,在算出tmp后,让dp[n]等于tmp.

解题代码

class Solution:
    def dicesProbability(self, n: int) -> List[float]:
        # dp[i]为和为i的时候的概率
        dp = [1/6] * 6 # 初始的时候,只有6种情况
        for i in range(2, n+1):
            tmp = [0] * (5 * i + 1) # 比如只扔一个骰子的场合有6种和,扔两个骰子的场合有11种和
            for j in range(len(dp)):
                for k in range(6):
                    tmp[k + j] += dp[j]/6 # 出现这个dp[k]的概率毕竟只有1/6啊 
            dp = tmp
        return dp

执行结果

执行结果:通过
执行用时:36 ms, 在所有 Python3 提交中击败了37.85%的用户
内存消耗:14.8 MB, 在所有 Python3 提交中击败了95.98%的用户

版权声明:
作者:iLemonRain
链接:http://314401480.xyz/?p=409
来源:柠檬酱的blog
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录