1105. Filling Bookcase Shelves
題目網址:https://leetcode.cn/problems/filling-bookcase-shelves/
題意:給一整數 array
books
,其中books[i] = [thickness_i, height_i]
表示第i
本書的厚度和高度。且會得到一個整數shelfWidth
。按順序將這些書擺放到總寬度為
shelfWidth
的書架上。先選幾本書放在書架上(它們的厚度之和小於等於書架的寬度
shelfWidth
), 然後再建一層書架。重覆這個過程, 直到把所有的書都放在書架上。需要注意的是, 在上述過程的步驟中, 擺放書的順序須與整理好的順序相同。
- 例如, 如果有
5
本書, 那麼可能的一種擺放情況是:第一和第二本書放在第一層書架上, 第三本書放在第二層書架上, 第四和第五本書放在最後一層書架上。返回以這種方式布置書架的最小高度。
Solution:
想法:利用 DP
1. 定義狀態:
- 首先, 會在
books
前先加上一個0
, 代表什麼元素都沒有的狀態dp[i]
:代表books[1:i]
中布置書架的最小高度2. 得到轉移方程:
- 若
sum(books[j:i].width) ≤ shelfWidth
, 則將books[j:i]
放在同一層, 並更新當前層的最大高度height
, 則dp[i]
可由上一層建構而來
➔ 故dp[i] = max(dp[i], dp[j - 1] + height)
, 其中1 ≤ j < i
3. 初始化:
dp[0]
:沒有書的書架, 其書架的最小高度為0
dp[1]
:只有一本書的書架, 其書架的最小高度為books[1].height
class Solution { |
- time:$O(n^2)$ ➔ for loop
- space:$O(n)$ ➔
dp
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論