当前位置: 首页剑指offer刷题第六期问题详情 【动态规划专题】剑指 Offer 60. n个骰子的点数 本问题对应课程链接:剑指offer刷题第六期 要求: 1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。 2、给出你代码所用的时间复杂度和空间复杂度
共以下 6 个回答
时间复杂度$O(n^2)$,空间复杂度$O(n)$
class Solution {
public double[] statisticsProbability(int num) {
double[][] dp = new double[num + 1][num * 6 + 1];
for(int i = 1; i <= 6; i++)
dp[1][i] = 1.0 / 6;
}
//时空复杂度均为On2
class Solution { statisticsProbability(int n) { res (n * 6 – n + 1);> dp(n + 1, vector (6 * n + 1, 0));
public:
vector
vector
vector<vector
for(int i = 1; i <= 6; i ++) {
dp[1][i] = 1;
}
for(int i = 2;i <= n; i ++) {
for(int j = i; j <= 6 * i; j ++) {
for(int k = 1; k <= 6; k ++) {
if(j – k > 0) {
dp[i][j] += dp[i – 1][j – k];
} else {
break;
}
}
}
}
};
思路:假设骰子个数为 n 个,dp[n, x] 表示 n 个骰子点数和为 x 的概率,则当骰子个数为 n + 1 个时:
dp[n+1, x] 为 n+1 个骰子点数和为 x 的概率,可以从 dp[n] 计算:
dp[n+1, x] = dp[n, x-1] * 1/6 + dp[n, x-2] * 1/6 + … + dp[n, x-6] * 1/6
可以发现,当 x < i 时,x-i 可能小于0, 发生越界,因此我们可以正序进行计算,即 dp[n, x] 仅可以为 dp[n+1, x+1], dp[n+1, x+2], …, dp[n+1, x+6] 增加概率:
dp[n+1, x+1] += dp[n, x] * 1/6;
dp[n+1, x+2] += dp[n, x] * 1/6;
…
dp[n+1, x+6] += dp[n, x] * 1/6
“`c++ statisticsProbability(int num) { dp(6, 1.0 / 6.0); tmp(5 * i + 1, 0.0);
class Solution {
public:
vector
vector
for (int i=2; i<=num; i++) { vector
for (int j=0; j < dp.size(); j++) { for (int k=0; k<6; k++) { tmp[j+k] += dp[j] / 6.0; } } dp = tmp; } return dp; } }; ```