n個骰子的點數
把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,列印出s的所有可能的值出現的概率。
你需要用乙個浮點數陣列返回答案,其中第 i 個元素代表這 n 個骰子所能擲出的點數集合中第 i 小的那個的概率。
示例 1:
輸入:1輸出:[0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]示例 2:
輸入:2輸出:[0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111,0.08333,0.05556,0.02778]限制:
1 <= n <= 11
方法一:遞迴(超時)
public double twosum(int n)
return ans;
}//計算有n個骰子,點數和為sum的情況
public int count(int sum, int n)
if (sum <= 0 || n <= 0)
int s = 0;
for (int i = 1; i <= 6; i++)
return s;
}
時間複雜度o(6n)
空間複雜度o(n):遞迴棧
方法二:記憶優化(超時)
public double twosum(int n)
return ans;
}public int count(int sum, int n, int dp)
if (sum <= 0 || n <= 0)
if (dp[sum][n] != 0)
for (int i = 1; i <= 6; i++)
return dp[sum][n];
}
時間複雜度o(n2)
空間複雜度o(n2)
方法三:動態規劃
public double twosum(int n)
for (int i = 2; i <= n; i++)
dp[j][i] += dp[j - k][i - 1];}}
}int type = n * 6 - n + 1;
double ans = new double[type];
for (int i = 0; i < type; i++)
return ans;
}
時間複雜度o(n2)
空間複雜度o(n2)方法四:空間優化
public double twosum(int n)
for (int i = 2; i <= n; i++)
dp[j] += dp[j - k];}}
}int type = n * 6 - n + 1;
double all = math.pow(6, n);
double ans = new double[type];
for (int i = 0; i < type; i++)
return ans;
}
時間複雜度o(n2)
空間複雜度o(n)
n個骰子的點數
把n個骰子扔在地上,所有骰子朝上的一面的點數之和為s。輸入n,列印出s的所有可能的值和出現的概率。1 基於迴圈求骰子點數 2int g maxvalue 6 骰子的點數個數 3void printprobability int number number 為骰子個數49 int pprobabili...
n個骰子的點數
題目 把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,列印出s的所有可能的值出現的概率。方法一 遞迴 思路 設n個骰子某次投擲點數和為s的出現次數是f n,s 那麼,f n,s 等於n 1個骰子投擲的點數和為s 1 s 2 s 3 s 4 s 5 s 6時的次數的總和 f n s f n...
n個骰子的點數
題目 把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,列印出s的所有可能的值出現的概率。方法一 遞迴 思路 設n個骰子某次投擲點數和為s的出現次數是f n,s 那麼,f n,s 等於n 1個骰子投擲的點數和為s 1 s 2 s 3 s 4 s 5 s 6時的次數的總和 f n s f n...