LeetCodeEasy-【面試題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

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/nge-tou-zi-de-dian-shu-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

思路1:找規律

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
代碼1:

class Solution:
    def twoSum(self, n: int) -> List[float]:
        ans = [[0] * (n*6+1) for _ in range(n+1)]
        for i in range(1, 7):
            ans[1][i] = 1
        for i in range(2, n+1):
            # 累加和
            leisum = [0] * (n*6+1)
            for j in range(1, i*6+1 if i*6+1 < 7*n//2+2 else 7*n//2+2):
                leisum[j] = ans[i-1][j] + leisum[j-1]
            # 計算前一半
            for j in range(2, i*6+1 if i*6+1 < 7*n//2+2 else 7*n//2+2):
                ans[i][j] = leisum[j-1]
                # 去掉不可能湊成的:例如前n-1個爲3,即加上第三個不可能湊成10
                if j - 7 > 0:
                    ans[i][j] -= leisum[j-7]
            # 後一半
            for k in range(i, 7*i//2+1):
                ans[i][7*i-k] = ans[i][k]
        # print(ans[n])
        # print((ans[n]), sum(ans[n]))
        sum1 = sum(ans[n])
        for i in range(n, 6*n+1):
            ans[n][i] /= sum1
        return ans[n][n:]

代碼2:

class Solution:
    def twoSum(self, n: int) -> List[float]:
        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):
            for j in range(i,i*6+1):
                for k in range(1,7):
                    if j >= k+1:
                        dp[i][j] +=dp[i-1][j-k]
        res = []
        for i in range(n,n*6+1):
            res.append(dp[n][i]*1.0/6**n)
        return res
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章