Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การเติมชั้นวางหนังสือใน Python


สมมติว่าเรามีหนังสือเป็นลำดับ - ที่นี่หนังสือเล่มที่ i มีหนังสือความหนา[i][0] และความสูง[i][1] หากเราต้องการจัดวางหนังสือเหล่านี้บนชั้นวางหนังสือที่มีความกว้างทั้งหมด หากเราเลือกหนังสือบางเล่มที่จะวางบนชั้นวางนี้ (เช่น ผลรวมของความหนาคือ <=shelf_width) ให้สร้างชั้นวางอีกระดับของตู้หนังสือโดยที่ความสูงรวมของตู้หนังสือเพิ่มขึ้นตามความสูงสูงสุดของชั้นวาง หนังสือที่เราวางลงได้ เราจะทำขั้นตอนนี้ซ้ำจนกว่าจะไม่มีหนังสือที่จะวางอีกต่อไป เราต้องจำไว้ว่าในแต่ละขั้นตอนของกระบวนการข้างต้น ลำดับของหนังสือที่เราวางจะเหมือนกับลำดับของหนังสือที่ให้มา เราต้องหาความสูงขั้นต่ำที่เป็นไปได้ที่ชั้นวางหนังสือทั้งหมดสามารถทำได้หลังจากวางชั้นวางในลักษณะนี้ ดังนั้นหากอินพุตเป็น − [[1,1], [2,3], [2,3], [1,1], [1,1], [1,1], [1,2]] , และ self_width =4,

การเติมชั้นวางหนังสือใน Python

จากนั้นผลลัพธ์จะเป็น 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