1105. Filling Bookcase Shelves
Problem
Approach
Given DP[i]
is the minimum height for the previous i
books, which is books[:i + 1]
. So, we can get DP[i]
from DP[i - 1]
. More importantly, as for books[i]
we have two choices that the first one is to put the book on a new level and the another is to put some books next to i-th
book together, maybe books[j], books[j + 1], ... , books[i]
. Consider the second choice, because i-th
book is the last one, so we must try our best to put more books in the same level to decrease the last answer.
Code
class Solution {
public int minHeightShelves(int[][] books, int shelf_width) {
int n = books.length;
int[] dp = new int[n + 1];
dp[0] = 0;
for(int i = 1; i < dp.length; i ++){
int h = books[i - 1][1];
dp[i] = dp[i - 1] + h;
int cw = books[i - 1][0];
int hmax = books[i - 1][1];
for(int j = i - 2; j >= 0; j --){
if(cw + books[j][0] > shelf_width){
break;
}
else{
cw += books[j][0];
hmax = Math.max(hmax, books[j][1]);
dp[i] = Math.min(dp[i], dp[j] + hmax);
}
}
}
return dp[n];
}
}