題目描述:
把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]
思路概述:
題目的意思是,n個骰子能搖出來的點數,按點數從小到大排序,對應的概率是多少。
分析:1個骰子點數:1 2 3 4 5 6 ,每個結果都只有1次組合,概率都為1/6
2個骰子點數:2 3 4 5 6 7 …10 11 12
其中2(1+1) 3(1+2,2+1) 4(1+3,2+2,3+1)…12(6 + 6)
也就是2個骰子,可以看作在1個骰子之後,又搖了乙個,目標點數=新骰子的點數+之前的點數
所以遞推方程:dp[n][k] = dp[n-1][k-1]+ dp[n-1][k-2]+ dp[n-1][k-3]+ dp[n-1][k-4]+ dp[n-1][k-5]+ dp[n-1][k-6]
**如下:
class
solution
for(
int i =
2; i <= n; i++
) dp[i]
[j]+= dp[i-1]
[j - k];}
}}double
res =
newdouble[5
* n +1]
;double sum = math.
pow(
6,n)
;for
(int i =
0; i < res.length; i++
)return res;
}}
劍指 Offer 60 n個骰子的點數
把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,列印出s的所有可能的值出現的概率。你需要用乙個浮點數陣列返回答案,其中第 i 個元素代表這 n 個骰子所能擲出的點數集合中第 i 小的那個的概率。示例 1 輸入 1 輸出 0.16667,0.16667,0.16667,0.16667,0....
劍指 Offer 60 n個骰子的點數
用dp i j 表示擲完 i 個骰子之後其點數之和為 j 的總次數,這可以由 投擲完 n 1 枚骰子後,對應點數 j 1,j 2,j 3,j 6 出現的次數之和轉化過來。即 1 class solution 910 for int i 2 i n i 17 18 1920 int total pow...
劍指 Offer 60 n個骰子的點數
dp三步走 1.表示狀態 dp i j 表示擲i個骰子,點數之和為j的概率。2.狀態轉移方程 遞推公式dp i j dp i 1 j 1 dp i 1 j 6 i個骰子和為j的概率 i 1個骰子和為j 1 最後乙個骰子擲出1的概率 i 1個骰子和為j 6 最後乙個骰子擲出6的概率 3.邊界處理 i ...