剑指 Offer 60. n个骰子的点数 动态规划

剑指 Offer 60. n个骰子的点数

class Solution {
public:
    vector<double> dicesProbability(int n) {
        vector<double> dp(6,1.0/6.0);
        for(int i=2;i<=n;++i){
            //由于 dp[i]仅由 dp[i-1]递推得出,为降低空间复杂度,只建立两个一维数组dp,tmp交替前进即可。
            vector<double> tmp(5*i+1,0);  //每次的点数之和范围会有点变化,点数之和的值最大是i*6,最小是i*1,
            for(int j=0;j<dp.size();++j){  //先拿i-1个骰子的点数之和数组的第j个值,它所影响的是i个骰子时的temp[j+k]的值
               for(int k=0;k<6;++k){
                   tmp[j+k]+=dp[j]/6.0;  //上dp数组值与1/6的乘积,1/6是第i个骰子投出某个值(k+1)的概率
               } 
            }
            dp=tmp;//更新dp数组,dp数组就会代表i个骰子时的可能出现的点数之和的概率;用于计算i+1个骰子时的点数之和的概率
        }
        return dp;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值