填充书架

int minHeightShelves(vector<vector<int>>& books, int shelf_width) {
    // 设dp[i]表示books[0..i)子问题的最小高度,
    // books[i-1]可以和books[j..i-1)放在一层,即books[j..i-1]在一层,
    //  j<i 且 sum(books[j..i-1][0])<=shelf_width
    // dp[i] = min{ dp[j] + max{ books[j..i-1][1] }}
    const int N = books.size();
    vector<int> dp(N + 1, 1e9);
    dp[0] = 0;
    for (int i = 1; i <= N; i++) {
        int width = 0, height = 0;
        for (int j = i - 1; j >= 0 && width + books[j][0] <= shelf_width; j--) {
            width += books[j][0];
            height = max(height, books[j][1]);
            dp[i] = min(dp[i], dp[j] + height);
        }
    }
    return dp[N];
}