剑指offer【60】:n个骰子得点数取值

题目:

在这里插入图片描述

思路+代码:

思路
动态规划,总可能出现情况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(n
2); 初始化一个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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值