题目
- 把 n 个骰子扔在地上,所有骰子朝上一面的点数之和为 s。输入 n,打印出 s 的所有可能的值出现的概率。
- leetcode链接:https://leetcode-cn.com/problems/nge-tou-zi-de-dian-shu-lcof/
思路
- 动态规划:下次的骰子和可以由上一次骰子和次数决定
代码
/**
* @param {number} n
* @return {number[]}
*/
var dicesProbability = function (n) {
// 1. dp[i][j] 使用i次骰子,摇出j点数和的次数
// 2. dp[i][j] = dp[i-1][j-k], 1 <= k <= 6
// 3. 初始化0
// 4. 遍历顺序:左到右,上到下
const dp = new Array(n + 1).fill().map(() => new Array(6 * n + 1).fill(0))
for (let j = 1; j <= 6; j++) {
dp[1][j] = 1
}
for (let i = 2; i <= n; i++) {
for (let j = i; j <= 6 * i; j++) {
for (let dian = 1; dian <= 6; dian++) {
if (j - dian > 0) {
dp[i][j] += dp[i - 1][j - dian]
}
}
}
}
const all = Math.pow(6, n)
const result = []
for (let i = n; i <= 6 * n; i++) {
result.push(dp[n][i] / all)
}
return result
}