這裡有 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示例 2:輸出:1
輸入:d = 2, f = 6, target = 7示例 3:輸出:6
輸入:d = 2, f = 5, target = 10示例 4:輸出:1
輸入:d = 1, f = 2, target = 3示例 5:輸出:0
輸入:d = 30, f = 30, target = 500輸出:222616187
1 <= d, f <= 30狀態變數dp[i][j]表示用i個骰子得到的點數總和為j的方法總數;1 <= target <= 1000
因為乙個骰子能夠投擲出的點數的情況為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...