class Solution:
def dicesProbability(self, n: int) -> List[float]:
dp = [[0] * (6 * n + 1) for _ in range(n + 1)]
for i in range(6):
dp[1][i + 1] = 1
for i in range(2, n + 1):
for j in range(i, 6 * n + 1):
for k in range(1, 7):
if j < k:
break
dp[i][j] += dp[i - 1][j - k]
res = [0] * (5 * n + 1)
idx = 0
den = pow(6, n)
for i in range(n, 6 * n + 1):
res[idx] = dp[n][i] / den
idx += 1
return res
共以下 13 个回答
class Solution {
public double[] statisticsProbability(int num) {
int[][] dp = new int[num+1][6num+1];//当有i个骰子时有j个组合
for(int i=1;i<=6;i++){
dp[1][i] = 1;
}
for(int i=2;i<=num;i++){
for(int j=i;j<=6i;j++){
for(int t=1;t<7;t++){
if(j<t)break;
dp[i][j]+= dp[i-1][j-t];
}
}
}
“`java
class Solution {
public double[] statisticsProbability(int num) {
//只有一个骰子的时候,概率都是1/6,有两个骰子的时候
//骰子个数为n时,数字和的范围是[n,6n],总个数为6n-n+1=5n+1
double[] dp = new double[6];
Arrays.fill(dp, 1.0/6.0);
for (int i = 2; i <= num; i++) { double[] tmp = new double[5*i + 1]; for (int j = 0; j < dp.length; j++){ for (int k = 0; k < 6; k++) { tmp[j+k] += dp[j] * 1.0/6; } } dp = tmp; } return dp; } }
时间复杂度:O(n^2)
空间复杂度:O(n)
MY记得查idx
假设 dp[i][j] 表示投掷 i 个骰子后,点数和为 j 的次数。那么 dp[i][j] 可以由前一个状态 dp[i-1][j-k] 转移过来,其中 k 为第 i 个骰子的点数(1 到 6)。
【思路】DP思路,dp[i][j]表示用i个骰子掷出j总和的可能性有几种,最后将dp[n][n]~dp[n][6n]除以6^n即为答案
【复杂度】时间O(n^2),空间可以优化为O(n)
看大神的
复杂度O(n^2)
动态规划,看其他人的
时间:O(n^2)
空间:O(n)
“`C++ probability(int n) {> dp(n+1, vector(6*n+1, 0));
vector
// 定义一个n+1行、6n+1列的二维数组,用于记录每个点数和出现的次数
vector
}
“`