鸽了好久的打题博客~要继续补起来了!
今天不打题,明天变垃圾 QAQ
class Solution {
public double[] dicesProbability(int n) {
// 第一行、最后一列舍弃,方便下标理解
// dp[骰子数][可投出点数] = 对应次数
double[][] dp = new double[n + 1][6 * n + 1];
// 初始化
for(int i = 1; i <= 6; i++) {
dp[1][i] = 1;
}
// dp 过程
for(int i = 2; i <= n; i++) {
// 范围[i, 6 * i]
for(int j = i; j <= 6 * i; j++) {
// 取上一层的前6个
for(int k = 1; k <= 6; k++) {
// 取不到6个则有多少取多少
if(j - k <= 0) {
break;
}
// 状态转移方程
dp[i][j] += dp[i - 1][j - k];
}
}
}
// 结束,取答案
double all = Math.pow(6, n);
double[] ans = new double[5 * n + 1];
for(int i = 0; i < ans.length; i++) {
ans[i] = dp[n][i + n] / all;
}
return ans;
}
}
class Solution {
public double[] dicesProbability(int n) {
// 0 下标不取,一共 6 * n 个格子
double[] dp = new double[6 * n + 1];
// 初始化,全为1
for(int i = 1; i <= 6; i++) {
dp[i] = 1;
}
// 2个、3个...n个骰子,以此类推
for(int i = 2; i <= n; i++) {
// 从后往前,可推n个骰子范围[n, 6 * n]
for(int j = 6 * i; j >= i; j--) {
// 给新的格子赋值
dp[j] = 0;
// 获取前六个格子的值(类似走楼梯)
for(int k = 1; k <= 6; k++) {
// 过于倒退的情况,结束(不一定都能取6个)
if(j - k < i - 1) {
break;
}
// 累加前面的格子值
dp[j] += dp[j - k];
}
}
}
// 获取答案
double all = Math.pow(6, n);
double[] ans = new double[5 * n + 1];
for(int i = 0; i < ans.length; i++) {
ans[i] = dp[n + i] / all;
}
return ans;
}
}
class Solution {
public double[] dicesProbability(int n) {
// 1. dp初始化
int[][] ans = new int[n + 1][6 * n + 1];
for(int i = 1; i <= 6; i++) {
ans[1][i] = 1;
}
// 2. dp 过程 O(n^2)
for(int i = 2; i <= n; i++) {
for(int j = i; j <= i * 6; j++) {
for(int k = 1; k <= 6 && j - k >= i - 1; k++) {
ans[i][j] += ans[i - 1][j - k];
}
}
}
// 3. 获取答案
double[] myAns = new double[5 * n + 1];
for(int i = 0; i < myAns.length; i++) {
myAns[i] = ans[n][i + n] / Math.pow(6, n);;
}
return myAns;
}
}
class Solution {
public double[] dicesProbability(int n) {
// 1. dp初始化
int[] ans = new int[6 * n + 1];
for(int i = 1; i <= 6; i++) {
ans[i] = 1;
}
// 2. dp 过程 O(n^2)
for(int i = 2; i <= n; i++) {
for(int j = 6 * i; j >= i; j--) {
ans[j] = 0;
for(int k = 1; k <= 6 && j - k >= i - 1; k++) {
ans[j] += ans[j - k];
}
}
}
// 3. 获取答案
double[] myAns = new double[5 * n + 1];
for(int i = 0; i < myAns.length; i++) {
myAns[i] = ans[i + n] / Math.pow(6, n);;
}
return myAns;
}
}