每日一道Leetcode - 剑指 Offer 60. n个骰子的点数【动态规划】

在这里插入图片描述

class Solution:
    def dicesProbability(self, n: int) -> List[float]:
        """
        分析问题:2枚骰子的情况
        第一枚可能情况:1,2,3,4,5,6 【已知情况】
        第二枚可能情况(在第一枚的基础上):1+[1-6],2+[1-6]..6+[1-6]
        如果想要在2枚骰子的情况下得到点数为4:
        那么第二枚骰子(第一枚情况,第二枚情况) = (1,3),(2,2),(3,1) 
        n-1 为 前一个骰子数的结果 j为想要的点数 i为当前骰子的点数
        再拓展一下:(n-1)枚骰子的(j-i) 的 六种情况
        """
        # 对于已知情况【即一枚骰子】每种点数出现的概率为1/6
        base = 1/6
        # 对于每个骰子,可能情况为6,12...
        dp = [[0]*(6*i+1) for i in range(n+1)]
        for i in range(1,7):
            dp[1][i] = base
        for i in range(2,n+1):
            for j in range(i,6*i+1):
                # 最小的情况一定是从i开始的,如:两颗骰子所得点数最小为2,最大为2个6的情况
                # dp[i-1]指的是上一个骰子
                # 当前骰子有6种可能即:1-6
                # 要凑够当前点数j,那么上一个骰子数就可以从j-1,j-2,..j-6中选,最小的是j-6,最大的是j-1,把这种情况相加,每种情况概率是1/6,再乘起来
                # 因为j-6可能存在越界的情况 所以用 max(0,j-6)
                dp[i][j] = sum(dp[i-1][max(0,j-6):j])*base
        # 最后返回第n个骰子的情况
        return dp[n][n:]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值