問題
有一個書的高度和寬度組成的序列,現在需要把這些書按照順序放進書架子上,書架子的寬度是固定的。現在需要找到書櫃最小高度。注意,在上述過程的每個步驟中,我們放置圖書的順序與給定的圖書順序相同。例如,如果我們有一個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];
}