1155 擲骰子的N種方法

2021-09-26 13:16:43 字數 1352 閱讀 1920

暑假刷題水題居多,多數都沒有什麼記錄的價值,不過還是有題目是有必要寫下來供自己以後複習的。

先上一題前幾天寫的題目

1155. 擲骰子的n種方法

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

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

如果需要擲出的總點數為 target,請你計算出有多少種不同的組合情況(所有的組合情況總共有 f^d 種),模 10^9 + 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

應該第一眼就可以想到遞迴了,但是看一下資料 d f 在30 target在1000

甚至有的時候需要mod 10000000007這個數字,說明一定是非常非常大的計算量。

不存狀態的遞迴一定是算不出來的,會超時的。

存狀態可以在遞迴中存,也可以用動態規劃。

我們先擼一下,尋常遞迴該怎麼寫

class solution 

public int dfs(int d, int f, int target, int index)

}return ans;

}}

這樣不難,加乙個index條件限制到了d然後判定target == 0就行,意料之中的超時。

那就考慮用乙個陣列來存中間狀態,這和動態規劃的思想可以說是很像了。

這樣的方法以前講過。

class solution 

return dfs(d, f, target, 1);

}public int dfs(int d, int f, int target, int index)

}t[index][target] = ans;

return ans;

}}

比動態規劃稍慢。

class solution }}

return dp[d][target];

}}

動態規劃的寫法。

1155 擲骰子的n種方法

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

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