劍指Offer50 n個色子的點數

2021-10-03 01:46:57 字數 2247 閱讀 4636

把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,列印出s的所有可能的值出現的概率。

你需要用乙個浮點數陣列返回答案,其中第 i 個元素代表這 n 個骰子所能擲出的點數集合中第 i 小的那個的概率。

示例

輸入: 1

輸出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]

輸入: 2

輸出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111,0.08333,0.05556,0.02778]

一開始我以為這是一道數學題,想著找找規律,emmmm,然鵝並沒什麼規律。後來發現這是一道動態規劃題目,一直以為動態規劃的題目主要用來求最xx問題的,所以沒有往dp上想,看樣子動態規劃學的還是不太行。

2.1 定義dp與初始化

如果用二維陣列實現dp,就需要定義乙個行數為n+1

n+1n+

1,列數為6∗n

+1

6*n+1

6∗n+

1的矩陣,dp[i][j]表示使用i個色子出現的和為j的次數。並且將下標為1的那一行初始化:

dp =[[

0for i in

range(6

* n +1)

]for j in

range

(n +1)

]for i in

range(1

,7):

dp[1]

[i]=

1

2.2 定義狀態轉移方程

這個問題之所以能夠使用dp解決,就是因為狀態可以疊加:k個色子求和的結果和k-1個色子有關。當有k-1個骰子時,再增加乙個骰子,這個骰子的點數只可能為1、2、3、4、5或6。在k-1個骰子的基礎上,再增加乙個骰子出現點數和為n只有 下面6中情況:

(k-1,n-1):第k個骰子投了點數1

(k-1,n-2):第k個骰子投了點數2

(k-1,n-3):第k個骰子投了點數3

(k-1,n-6):第k個骰子投了點數6

所以:f(k,n)=f(k-1,n-1)+f(k-1,n-2)+f(k-1,n-3)+f(k-1,n-4)+f(k-1,n-5)+f(k-1,n-6)​

2.3 **實現

c++**

class

solution

for(

int i =

1; i <=

6; i++

)for

(int i =

2; i <= n; i++)}

}}vector<

double

> ans;

float base =

pow(

6, n)

;for

(int i = n; i <=

6* n; i++

)return ans;}}

;

python**

class

solution

(object):

deftwosum

(self, n)

: dp =[[

0for i in

range(6

* n +1)

]for j 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,6

* i +1)

:for k in

range(1

,7):

if j - k >0:

dp[i]

[j]+= dp[i -1]

[j - k]

base = math.

pow(

6, n)

return

[counts /

float

(base)

for counts in dp[n]

[n:]

]

(完)

n個骰子 劍指offer

暴力求解,n個骰子和為s就等於n 1個骰子和分別為s 1 s 6時次數的總和。據此寫出 如下 int baoli int n,int s int count 0 count baoli n 1,s 1 baoli n 1,s 2 baoli n 1,s 3 baoli n 1,s 4 baoli n...

劍指offer 43 n個骰子的點數

n個骰子的點數 把n個骰子扔在地上,點數之和為s,輸入個數n,列印出所有可能的值出現的概率 解法1 兩個矩陣迭代相加,乙個點數等於之前6個點數相加 public class main public static void printpro int n int matrix new int 2 6 n...

劍指offer43 n個骰子的點數

類似青蛙跳台階的問題 第n個骰子點數為1的話,f n,s f n 1,s 1 當第n個骰子點數為2的話,f n,s f n 1,s 2 依次類推。在n 1個骰子的基礎上,再增加乙個骰子出現點數和為s的結果只有這6種情況!f n,s f n 1,s 1 這個等式只是在 第n個點數為1的時候,所有考慮的...