把n個骰子仍在地上,所有的骰子朝上的一面的點數之和為s,輸入n,列印出s所有可能的值出現的概率。
乙個骰子的情況
input: n =
1output:[[
1,0.17],
[2,0.17],
[3,0.17],
[4,0.17],
[5,0.17],
[6,0.17
]]
兩個骰子的情況
input: n =
2output:[[
2,0.03],
[3,0.06],
[4,0.08],
[5,0.11],
[6,0.14],
[7,0.17],
[8,0.14],
[9,0.11],
[10,0.08],
[11,0.06],
[12,0.03
]]
1、問題轉換,先求n個骰子點數和為s出現的次數
遞迴1、n個骰子點數和為s出現的次數,等於n-1個骰子點數和為 s - 1 的次數 + 點數和為 s - 2 的次數 + … + 點數和為 s - 6 的次數。
2、乙個骰子,點數和為1,2,…,6的次數為1。
public
intcount
(int n,
int s)
動態規劃
1、dp[i][j]
表示i個骰子點數和為j的次數
2、初始值,乙個骰子,點數和為1,2,…,6的次數為1
3、i個骰子,最小點數和為i
,最大點數和為6*i
public
intcount
(int n,
int s)
for(
int i =
2; i <= n; i++)}
}return dp[n]
[s];
}
2、聚合,統計所有s的情況,及出現的概率
public list
>
dicessum
(int n)
return result;
}
最終版本public list
>
dicessum
(int n)
for(
int i =
2; i <= n; i++)}
} list
> result =
newarraylist
<
>()
;double totalcount = math.
pow(n,6)
;for
(int s = n; s <=
6* n; s++
)return result;
}
60 n個骰子的點數
把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,列印出s的所有可能的值出現的概率。解法一 遞迴。可以先把n個骰子分為兩堆 第一堆只有乙個 另一堆有n 1個。單獨的那個有可能出現1 6的點數。接下來問題轉化成1 6的每一種點數和剩下的n 1個骰子來計算點數和。接下來把n 1個骰子仍然分成兩...
60 n 個骰子的點數
lintcode 把 n 個骰子扔在地上,求點數和為 s 的概率。使用乙個二維陣列 dp 儲存點數出現的次數,其中 dp i j 表示前 i 個骰子產生點數 j 的次數。空間複雜度 o n2 public list dicessum int n 空間複雜度 o n public list dices...
劍指 面試題60 n個骰子的點數
題目 把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,列印出s的所有可能的值出現的概率。你需要用乙個浮點數陣列返回答案,其中第 i 個元素代表這 n 個骰子所能擲出的點數集合中第 i 小的那個的概率。思路 動態規劃 參考leetcode題解 c class solution int su...