题目描述:
把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
输入: 1
输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]
输入: 2
输出:[0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111,0.08333,0.05556,0.02778]
思路:动态规划
f(n, s) 表示n个骰子点数和为s的排列情况总数
当n=1时, f(1,1)=f(1,2)=f(1,3)=f(1,4)=f(1,5)=f(1,6)=1
当n>=2时,f(n,s)=f(n-1,s-1)+f(n-1,s-2)+f(n-1,s-3)+f(n-1,s-4)+f(n-1,s-5)+f(n-1,s-6)
class Solution {
public double[] twoSum(int n) {
//dp[i][j]代表i枚色子和为j的概率
double[][] dp = new double[n + 1][6 * n + 1];
for (int i = 1; i <= 6; i++) {
dp[1][i] = 1d / 6;
}
for (int i = 2; i <= n; i++) {//骰子
for (int j = i; j <= i * 6; j++) {//点数
for (int k = 1; k < j; k++) {//当前骰子的点数
dp[i][j] += dp[1][k] * dp[i - 1][j - k];
}
}
}
result = Arrays.copyOfRange(dp[n], n, 6 * n + 1);
return result;
}
}
网友评论