leetcode 1155 擲骰子的N種方法

2021-09-28 22:48:43 字數 1825 閱讀 6604

這裡有 d

dd 個一樣的骰子,每個骰子上都有 f

ff 個面,分別標號為 1,2

,...

,f

1, 2, ..., f

1,2,..

.,f。

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

如果需要擲出的總點數為 tar

ge

ttarget

target

,請你計算出有多少種不同的組合情況(所有的組合情況總共有 f

df^d

fd種),模 109

+7

10^9 + 7

109+

7 後返回。

示例 1:

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

輸出:1

示例 2:

輸入:d = 2, f = 6, target = 7

輸出:6

示例 3:

輸入:d = 2, f = 5, target = 10

輸出:1

示例 4:

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

輸出:0

示例 5:

輸入:d = 30, f = 30, target = 500

輸出:222616187

1 <= d, f <= 30

1 <= target <= 1000

狀態變數dp[i][j]表示用i個骰子得到的點數總和為j的方法總數;

因為乙個骰子能夠投擲出的點數的情況為f種,對於dp[i][j],要求得dp[i][j]的方法數,可以通過以下狀態轉移方程求得:

d p[

i][j

]=dp

[i−1

][j−

1]+d

p[i−

1][j

−2]+

...+

dp[i

−1][

j−n]

(j

>=n

)dp[i][j] = dp[i-1][j-1] + dp[i-1][j-2] + ... + dp[i-1][j-n](j>=n)

dp[i][

j]=d

p[i−

1][j

−1]+

dp[i

−1][

j−2]

+...

+dp[

i−1]

[j−n

](j>=n

) 因此可以得到c++**如下:

class

solution

for(

int i=

2;i<=d;i++

) #從第二個骰子開始使用動態轉移方程

}}return dp[target];}

};

上面的c++**中使用的是一維陣列,如果想更好地理解,可以看下面的使用二維陣列的c++**:

class

solution

for(

int i=

2;i<=d;i++

) #使用動態轉移方程

}}return dp[d]

[target]

; #返回d個骰子擲出target點數的方法的個數

}};

Leetcode 1155 擲骰子的N中方法

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

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