问题
有一个书的高度和宽度组成的序列,现在需要把这些书按照顺序放进书架子上,书架子的宽度是固定的。现在需要找到书柜最小高度。注意,在上述过程的每个步骤中,我们放置图书的顺序与给定的图书顺序相同。例如,如果我们有一个5本书的有序列表,我们可以把第一和第二本书放在第一个书架上,第三本书放在第二个书架上,第四和第五本书放在最后一个书架上。
输入: books = [[1,1],[2,3],[2,3],[1,1],[1,1],[1,1],[1,2]], shelf_width = 4
输出: 6
解释:
3个架子的高度之和是1 + 3 + 2 = 6。
注意第二本书不一定要在第一书架上。
解析
在能够放得下的情况下,dp[i] = min(dp[i],min(dp[j]+books[j][1] )),另外还要创建一个变量用于记录这一层的最大高度。
Java代码
public int minHeightShelves(int[][] books, int shelf_width) {
int m = books.length;
int dp[] = new int[m+1];
for(int i=0;i<=m;i++){
dp[i] = Integer.MAX_VALUE;
}
dp[0] = 0;
for(int i=0;i<m;i++){
int curw=0,max_height=0;
for(int j=i;j>=0;j--){
curw += books[j][0];
max_height = Math.max(max_height, books[j][1]);
if(curw<=shelf_width){
dp[i+1] = Math.min(dp[i+1], dp[j]+max_height);
}
else{
break;
}
}
}
return dp[m];
}