关键思维:
因为是顺序放入,枚举所有可以组成一行的双闭区间[L,R],来取最小即可。
class Solution {
public:
int minHeightShelves(vector<vector<int>>& books, int shelf_width) {
int N = books.size();
int dp[N+1]; // dp[K]放入前K本书后的最小高度
memset(dp,0x3f,sizeof(dp));
dp[0] = 0;
// 枚举区间左边界L
for(int L=0;L<N;L++){
// 枚举区间右边界R
int W = 0, H = 0;
for(int R=L;R<N;R++){
W += books[R][0];
H = max(H,books[R][1]);
if(W > shelf_width) break;
else dp[R+1] = min(dp[R+1],dp[L] + H);
}
}
return dp[N];
}
};