สมมติว่าเรามีหนังสือเป็นลำดับ - ที่นี่หนังสือเล่มที่ i มีหนังสือความหนา[i][0] และความสูง[i][1] หากเราต้องการจัดวางหนังสือเหล่านี้บนชั้นวางหนังสือที่มีความกว้างทั้งหมด หากเราเลือกหนังสือบางเล่มที่จะวางบนชั้นวางนี้ (เช่น ผลรวมของความหนาคือ <=shelf_width) ให้สร้างชั้นวางอีกระดับของตู้หนังสือโดยที่ความสูงรวมของตู้หนังสือเพิ่มขึ้นตามความสูงสูงสุดของชั้นวาง หนังสือที่เราวางลงได้ เราจะทำขั้นตอนนี้ซ้ำจนกว่าจะไม่มีหนังสือที่จะวางอีกต่อไป เราต้องจำไว้ว่าในแต่ละขั้นตอนของกระบวนการข้างต้น ลำดับของหนังสือที่เราวางจะเหมือนกับลำดับของหนังสือที่ให้มา เราต้องหาความสูงขั้นต่ำที่เป็นไปได้ที่ชั้นวางหนังสือทั้งหมดสามารถทำได้หลังจากวางชั้นวางในลักษณะนี้ ดังนั้นหากอินพุตเป็น − [[1,1], [2,3], [2,3], [1,1], [1,1], [1,1], [1,2]] , และ self_width =4,
จากนั้นผลลัพธ์จะเป็น 6 เนื่องจากผลรวมของความสูงของชั้นวาง 3 ชั้นคือ 1 + 3 + 2 =6 สังเกตว่าเล่มที่ 2 ไม่จำเป็นต้องอยู่บนชั้นแรก
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- สร้างหนึ่งอาร์เรย์ dp ที่มีขนาดเท่ากับหนังสือ และเติมค่านี้โดยใช้อนันต์
- dp[0] :=หนังสือ[0,1]
- สำหรับฉันอยู่ในช่วง 1 ถึงความยาวของหนังสือ – 1
- curr_height :=0
- อุณหภูมิ :=self_width
- j :=ฉัน
- ในขณะที่ j>=0 และ temp – books[j, 0]>=0, do
- curr_height :=สูงสุดของหนังสือ[j, 1], curr_height
- dp[i] :=นาทีของ dp[i], curr_height + (dp[j - 1] ถ้า j – 1>=0, มิฉะนั้น 0)
- temp :=temp – books[j, 0]
- ลด j ทีละ 1
- คืนค่าองค์ประกอบสุดท้ายของ dp
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
class Solution(object): def minHeightShelves(self, books, shelf_width): """ :type books: List[List[int]] :type shelf_width: int :rtype: int """ dp = [float('inf') for i in range(len(books))] dp[0] = books[0][1] for i in range(1,len(books)): current_height = 0 temp = shelf_width j = i while j>=0 and temp-books[j][0]>=0: current_height = max(books[j][1],current_height) dp[i] = min(dp[i],current_height +( dp[j-1] if j-1 >=0 else 0)) temp-=books[j][0] j-=1 #print(dp) return dp[-1]
อินพุต
[[1,1],[2,3],[2,3],[1,1],[1,1],[1,1],[1,2]] 4
ผลลัพธ์
6