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;
}
};
剑指 Offer 60. n个骰子的点数 动态规划
最新推荐文章于 2024-09-27 11:17:47 发布