20. 骰子求和

20. 骰子求和

中文English

扔 n 个骰子,向上面的数字之和为 S。给定 n,请列出所有可能的 S 值及其相应的概率。

样例

样例 1:

输入:n = 1
输出:[[1, 0.17], [2, 0.17], [3, 0.17], [4, 0.17], [5, 0.17], [6, 0.17]]
解释:掷一次骰子,向上的数字和可能为1,2,3,4,5,6,出现的概率均为 0.17。

样例 2:

输入:n = 2
输出:[[2,0.03],[3,0.06],[4,0.08],[5,0.11],[6,0.14],[7,0.17],[8,0.14],[9,0.11],[10,0.08],[11,0.06],[12,0.03]]
解释:掷两次骰子,向上的数字和可能在[2,12],出现的概率是不同的。

注意事项

你不需要关心结果的准确性,我们会帮你输出结果。

输入测试数据 (每行一个参数)如何理解测试数据?
class Solution:
    # @param {int} n an integer
    # @return {tuple[]} a list of tuple(sum, probability)
    '''
    大致思路:
    1.如果n为1,则只会出现1-6,对应的概率为1/6
    2.如果n > 1,则对应出现的数字的概率
    转移方程:
    dp[i][j] = dp[i][j] + dp[i][j - k]#k代表当前投掷骰子的点数,j代表的是投掷点数之和,j - k代表的是上一次投掷那些点数出现的出现的概率
    '''
    def dicesSum(self, n):
        # Write your code here
        #初始条件
        dp = [[0]*(n*6 + 1) for _ in range(n + 1)]

        #如果是n = 1的话,则概率为1/6
        for i in range(1, 6 + 1):
            dp[1][i] = 1/6

        #如果是n > 1的话,则依次计算每个数出现的概率, dp[i][j] = dp[i][j] + dp[i][j - k]
        #计算顺序
        for i in range(2, n + 1):
            for j in range(i, i*6 + 1):
                for k in range(1, 7):
                    if (j - k) > 0:
                        dp[i][j] = dp[i][j] + dp[i - 1][j - k]
                        #dp[2][2] dp[2][3] ... dp[2][12]
                        #dp[1][1] 
                #除以6,表示是平均6份,避免总概率大于1
                dp[i][j] = dp[i][j]/6
        
        res = [[0]*2 for _ in range(n*6)]
        #依次循环,取出概率和,最后返回
        for z in range(n*6):
            res[z][0] = z + 1
            res[z][1] = dp[n][z + 1] 

        return res[n - 1: ]

 

posted @ 2020-06-21 21:46  风不再来  阅读(496)  评论(0编辑  收藏  举报