1155 擲骰子的N種方法

2021-10-04 07:27:50 字數 1646 閱讀 9192

這裡有 d 個一樣的骰子,每個骰子上都有 f 個面,分別標號為 1, 2, ..., f。

我們約定:擲骰子的得到總點數為各骰子面朝上的數字的總和。

如果需要擲出的總點數為 target,請你計算出有多少種不同的組合情況(所有的組合情況總共有 f^d 種),模 10^9 + 7 後返回。

示例 1:

輸入:d = 1, f = 6, target = 3

輸出:1

1.dfs

2.帶記憶的dfs

3.dp 轉移方程dp[i][j]=dp[i][j]+dp[i-1][k-j] ,dp[i][j]表示i個骰子求得j有多少種情況,

class solution(object):

def numrollstotarget(self, d, f, target):

""":type d: int

:type f: int

:type target: int

:rtype: int

"""if d==1:

return 1 if target<=f else 0

res=0

for i in range(1,f+1):

res+=self.numrollstotarget(d-1,f,target-i)

return res

class solution(object):

def numrollstotarget(self, d, f, target):

""":type d: int

:type f: int

:type target: int

:rtype: int

"""if f*dreturn 0

dp={}

def helper(d,t):

if (d,t) in dp:

return dp[(d,t)]

if d==1:

return 1 if 0tmp_sum=0

for i in range(1,f+1):

tmp_sum+=helper(d-1,t-i)

dp[(d,t)]=tmp_sum%(10**9+7)

return dp[(d,t)]

return helper(d,target)

class solution(object):

def __init__(self):

self.h={}

def numrollstotarget(self, d, f, target):

""":type d: int

:type f: int

:type target: int

:rtype: int

"""dp=[[0 for _ in range(1050)] for _ in range(35)]

dp[0][0]=1

for i in range(1,d+1):

for j in range(1,f+1):

for k in range(j,target+1):

dp[i][k]=(dp[i][k]+dp[i-1][k-j])%(10**9+7)

return dp[d][target]

1155 擲骰子的N種方法

暑假刷題水題居多,多數都沒有什麼記錄的價值,不過還是有題目是有必要寫下來供自己以後複習的。先上一題前幾天寫的題目 1155.擲骰子的n種方法 這裡有 d 個一樣的骰子,每個骰子上都有 f 個面,分別標號為 1,2,f。我們約定 擲骰子的得到總點數為各骰子面朝上的數字的總和。如果需要擲出的總點數為 t...

1155 擲骰子的n種方法

這裡有 d 個一樣的骰子,每個骰子上都有 f 個面,分別標號為 1,2,f。我們約定 擲骰子的得到總點數為各骰子面朝上的數字的總和。如果需要擲出的總點數為 target,請你計算出有多少種不同的組合情況 所有的組合情況總共有 f d 種 模 10 9 7 後返回。示例 1 輸入 d 1,f 6,ta...

leetcode 1155 擲骰子的N種方法

這裡有 d dd 個一樣的骰子,每個骰子上都有 f ff 個面,分別標號為 1,2 f 1,2,f 1,2,f。我們約定 擲骰子的得到總點數為各骰子面朝上的數字的總和。如果需要擲出的總點數為 tar ge ttarget target 請你計算出有多少種不同的組合情況 所有的組合情況總共有 f df...