int minHeightShelves(vector<vector<int>>& books, int shelf_width) {
auto n=books.size();
vector<int> dp(n+1,INT_MAX/2);
dp[0]=0;
for(int i=1;i<dp.size();i++){
auto& bo=books[i-1];
int w=bo[0],h=bo[1];
dp[i]=dp[i-1]+h;
for(int j=i-1;j>0;j--){
w+=books[j-1][0];
h=max(h,books[j-1][1]);
if(w>shelf_width) break;
dp[i]=min(dp[i],dp[j-1]+h);
}
}
return dp.back();
}
dp
两种情况:一种是直接在下一层;另一种是将之前上层的拿下来做同一层。