0%

1105. 填充书架

1105.填充书架

题目描述:

给出数组 books,其中 books[i] = {w,h}表示书的厚度和高度。给出一个整数 shelfWidth,表示书架的宽度。按顺序将所有的书放在书架上。如果放不下则放下一层,直到所有的书全放完,返回书架的最低高度。

数据范围:$1\le n \le 1000$

题解:

使用 $dp[i]$ 表示 $i$ 作为该层的最后一本书。那么需要考虑 $[j, i]$ 作为单独的一层。

可以倒着枚举 $j$,方便取 $sum$,直到 $sum > shelfWidth$ 时退出。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
auto optimize_cpp_stdio = []()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return 0;
}();
class Solution
{
public:
const static int maxn = 1e3 + 10;
int dp[maxn];
int minHeightShelves(vector<vector<int>> &books, int shelfWidth)
{
int n = books.size();
dp[0] = 0;
for (int i = 1; i <= n; ++i)
{
dp[i] = dp[i - 1] + books[i - 1][1];
int sum_w = books[i - 1][0];
int max_h = books[i - 1][1];
for (int j = i - 1; j > 0; --j)
{
sum_w += books[j - 1][0];
if (sum_w > shelfWidth)
break;
max_h = max(max_h, books[j - 1][1]);
dp[i] = min(dp[i], dp[j - 1] + max_h);
}
}
return dp[n];
}
};