劍指 Offer 題解 60 n 個骰子的點數

2021-10-02 19:01:58 字數 1526 閱讀 7853

把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...