剑指offer Leetcode 60.n个骰子的点数

image-20201221110906507

解法:动态规划

思想:

​ 可以把n个骰子的点数分解为n - 1个骰子的点数加上1个骰子的点数。根据1的概率数组求出2的概率数组,根据2求出3…直到求出n的点数。

●状态定义:tmp[]为n个骰子的概率数组,pre[]为n - 1个骰子的概率数组,1个骰子的概率数组显然是6个1/6

●初始状态: vectorpre = {1.0 / 6, 1.0 / 6, 1.0 / 6, 1.0 / 6, 1.0 / 6, 1.0 / 6};

●状态转移方程:tmp[x + y] += pre[x] * num[y];

​ num[y]这里就是1/6

image.png

复杂度:

●时间:O(N^2) 为n时需要(5 + 1) * 6 + (2 * 5 + 1) * 6 + … + (n * 5 + 1) * 6次计算,即O(N^2)

●空间: O(N^2) 5 * 1 + 1 + 5 * 2 + 1 + …+ 5 * n + 1

代码注意点:

●pre初始化时要为double,且元素为1.0/6

●第一层循环是n的迭代,从1到2到n

●第二层循环是遍历pre数组

●第三层循环是遍历6个1/6数组

代码:
class Solution {
public:
    vector<double> dicesProbability(int n) {
        // n为1时候的结果
        vector<double>pre = {1.0 / 6, 1.0 / 6, 1.0 / 6, 1.0 / 6, 1.0 / 6, 1.0 / 6};
        for(int i = 2; i <= n; ++i){
            vector<double>tmp(5 * i + 1, 0);        // 把骰子当成0 - 5,i个骰子范围0 - 5i,所以是5i + 1
            for(int j = 0; j < pre.size(); ++j)
                for(int k = 0; k < 6; ++k)
                    tmp[j + k] += pre[j] / 6;
            pre = tmp;
        }
        return pre;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值