暑假刷題水題居多,多數都沒有什麼記錄的價值,不過還是有題目是有必要寫下來供自己以後複習的。
先上一題前幾天寫的題目
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...