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

โปรแกรมค้นหาต้นทุนขั้นต่ำในการซื้อทั้งหมดใน Python


สมมติว่าเรามีรายการ N ซึ่งทำเครื่องหมายเป็น 0, 1, 2, …, N-1 จากนั้น เราได้รับรายการ 2 มิติของขนาด S ที่เรียกว่าชุด ที่นี่ เราสามารถซื้อชุดที่ i-th สำหรับชุดราคา[i,2] และเราได้รับทุกรายการระหว่างชุด[i, 0] ถึงชุด[i, 1] นอกจากนี้เรายังมีรายการของขนาด N ที่เรียกว่าการนำออก ซึ่งเราสามารถทิ้งองค์ประกอบที่ i-th จำนวน 1 อินสแตนซ์สำหรับการนำราคาออก[i] ดังนั้น เราต้องค้นหาต้นทุนขั้นต่ำในการซื้ออย่างแม่นยำในทุกองค์ประกอบตั้งแต่ 0 ถึง N-1 หรือผลลัพธ์จะเป็น -1 หากไม่สามารถทำได้

ดังนั้น ถ้าอินพุตเป็นเหมือนชุด =[ [0, 4, 4], [0, 5, 12], [2, 6, 9], [4, 8, 10]]

การลบ =[2, 5, 4, 6, 8] จากนั้นผลลัพธ์จะเป็น 4

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • N :=ขนาดของการลบ

  • กราฟ :=เมทริกซ์ใหม่สำหรับขนาด (N + 1) x (N + 1)

  • สำหรับแต่ละ s, e, w เป็นเซต, ทำ

    • เพิ่ม [e+1, w] ลงในกราฟ[s]

  • สำหรับแต่ละ i, r ในดัชนี i และ item r ในการลบ ทำ

    • เพิ่ม [i, r] ลงในกราฟ[i + 1]

  • pq :=ฮีปใหม่

  • dist :=แผนที่ใหม่

  • dist[0] :=0

  • ในขณะที่ pq ไม่ว่างเปล่าให้ทำ

    • d, e :=ลบรายการที่เล็กที่สุดออกจาก heap pq

    • ถ้า dist[e]

      • ดำเนินการซ้ำต่อไป

    • ถ้า e เท่ากับ N แล้ว

      • กลับ d

    • สำหรับแต่ละ nei, w ในกราฟ[e], ทำ

      • d2 :=d + w

      • ถ้า d2

        • dist[nei] :=d2

        • เพิ่ม [d2, nei] ไปยัง pq

  • กลับ -1

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

นำเข้า heapqfrom คอลเลกชันนำเข้า defaultdictclass โซลูชัน:def แก้ปัญหา (ตัวเอง, ชุด, การลบ):N =len (การลบ) กราฟ =[[] สำหรับ _ ในช่วง (N + 1)] สำหรับ s, e, w ในชุด:graph[s].append([e + 1, w]) for i, r in enumerate(removals):graph[i + 1].append([i, r]) pq =[[0, 0]] dist =defaultdict(แลมบ์ดา:float("inf")) dist[0] =0 ในขณะที่ pq:d, e =heapq.heappop(pq) if dist[e]  

อินพุต

[[0, 4, 4],[0, 5, 12],[2, 6, 9],[4, 8, 10]], [2, 5, 4, 6, 8] 

ผลลัพธ์

4