题目分析:[[EVD]] - 剑指 Offer 60. n个骰子的点数
https://leetcode-cn.com/problems/nge-tou-zi-de-dian-shu-lcof/
简单描述:
- 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
- 你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。
限制🚫
- 1 <= n <= 11
示例:
输入: 1
输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]
解题思路:
思路:
- #动态规划DP
- dp[i]:和为i的骰子当前的概率
- 状态转移分析:
- 每一个骰子的每个数都对6个和有影响
效率:
- 时间复杂度
- 空间复杂度
代码:
class Solution
{
public:
/*简单dp*/
vector<double> dicesProbability(int n)
{
vector<double> dp(6, 1.0 / 6.0); //初始化一个骰子的情况
for (int i = 2; i <= n; i++)
{
vector<double> tmp(5 * i + 1, 0); //初始化第i个骰子的情况,如:2个骰子有[2,12]共11个结果
for (int j = 0; j < dp.size(); j++)
{ //逐项添加增加一个骰子后,上一个骰子对其的影响
for (int k = 0; k < 6; k++)
{ //添加一个骰子最多影响6个结果
tmp[j + k] += dp[j] * (1.0 / 6.0);
}
}
dp = tmp; //最关键的地方,此处会更新dp数组的长度
}
return dp;
}
};