劍指offer 60 n個骰子得點數取值

2021-10-08 15:36:25 字數 1366 閱讀 7265

思路

動態規劃,總可能出現情況6n

初始狀態:n=1, 1,2,3,4,5,6;六種情況

轉移方程:第n次擲色子後的s值,f(n,s) = f(n-1,s-1)+f(n-1,s-2)+f(n-1,s-3)+f(n-1,s-4)+f(n-1,s-5)+f(n-1,s-6);

返回:第n次後,出現各值得情況次數 * 1/(6n)

時間複雜度:o(n2)

空間複雜度:o(n2); 初始化乙個n*(6n)的0陣列

class

solution

:def

twosum

(self, n:

int)

-> list[

float]:

# 思路:動態規劃,總可能出現情況6**n

# 初始狀態:n=1, 1,2,3,4,5,6;六種情況

# 轉移方程:第n次擲色子後的s值,f(n,s) = f(n-1,s-1)+f(n-1,s-2)+f(n-1,s-3)+f(n-1,s-4)+f(n-1,s-5)+f(n-1,s-6);

# 返回:第n次後,出現各值得情況次數 * 1/(6**n)

# 時間複雜度:o(n)

# 空間複雜度:o(n**2); 初始化乙個n*(6n)的0陣列

dp =[[

0for _ in

range(6

*n+1)]

for _ in

range

(n+1)]

for i in

range(1

,7):

dp[1]

[i]=

1for i in

range(2

,n+1):

for j in

range

(i,i*6+

1):for k in

range(1

,7):

if j >= k+1:

dp[i]

[j]+=dp[i-1]

[j-k]

res =

for i in

range

(n,n*6+

1):# 返回:第n次後,出現各值得情況次數 * 1/(6**n)

[i]*

1.0/

6**n)

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