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

โปรแกรมหาความสูงขั้นต่ำที่จะเพิ่มให้ถึงปลายทางใน Python


สมมติว่าเรามีเมทริกซ์ M โดยที่ M[r][c] แทนความสูงของเซลล์นั้น หากตอนนี้เราอยู่ที่มุมซ้ายบนและต้องการไปที่มุมล่างขวา เราสามารถย้ายไปยังเซลล์ที่อยู่ติดกัน (ขึ้น ลง ซ้าย ขวา) ได้ก็ต่อเมื่อความสูงของเซลล์ที่อยู่ติดกันนั้นน้อยกว่าหรือเท่ากับความสูงของเซลล์ปัจจุบัน เราสามารถเพิ่มความสูงของเซลล์จำนวนเท่าใดก็ได้ก่อนที่เราจะย้าย ดังนั้นเราต้องค้นหาความสูงรวมขั้นต่ำที่ต้องเพิ่มเพื่อไปที่เซลล์ด้านขวาล่าง

ดังนั้นหากอินพุตเป็นแบบ

2 4 5
8 6 1

จากนั้นผลลัพธ์จะเป็น 4 เนื่องจากเราสามารถใช้เส้นทางต่อไปนี้ [2, 4, 5, 1] ​​และเปลี่ยนความสูงเป็นการกำหนดค่านี้ -

5 5 5
8 6 1

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

INF :=อินฟินิตี้

  • R, C :=หมายเลขแถวของเมทริกซ์, หมายเลขคอลัมน์ของเมทริกซ์

  • pq :=สร้างลำดับความสำคัญของคิวโดยใช้ฮีปและแทรก [0, R-1, C-1, M[-1, -1]] ลงในนั้น

  • dist :=แผนที่

  • dist[R-1, C-1, A[-1, -1]] :=0

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

    • ลบหนึ่งองค์ประกอบจาก pq และเก็บไว้ใน d, r, c, h

    • ถ้า dist[r, c, h]

      • ไปอ่านตอนต่อไป

    • ถ้า r และ c เป็นทั้ง 0 แล้ว

      • กลับ d

    • สำหรับแต่ละคู่ (nr, nc) ใน [[r+1, c], [r, c+1], [r-1, c], [r, c-1]] ทำ

      • ถ้า 0 <=nr

        • ถ้า d2

          • dist[nr, nc, h2] :=d2

          • แทรก [d2, nr, nc, h2] ลงใน pq

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

ตัวอย่าง

import collections
import heapq
class Solution:
   def solve(self, A):
      INF = float('inf')
      R, C = len(A), len(A[0])

      pq = [[0, R-1, C-1, A[-1][-1]]]
      dist = collections.defaultdict(lambda: INF)
      dist[R-1, C-1, A[-1][-1]] = 0
      while pq:
         d, r, c, h = heapq.heappop(pq)
         if dist[r, c, h] < d:
            continue
         if r == c == 0:
            return d
         for nr, nc in [[r+1, c], [r, c+1], [r-1, c], [r, c-1]]:
            if 0 <= nr < R and 0 <= nc < C:
               h2 = max(A[nr][nc], h)
               d2 = d + max(h2 - A[nr][nc], 0)
               if d2 < dist[nr, nc, h2]:
                  dist[nr, nc, h2] = d2
                  heapq.heappush(pq, [d2, nr, nc, h2])
ob = Solution()
matrix = [
[2, 4, 5],
[8, 6, 1]
]
print(ob.solve(matrix))

อินพุต

[[2, 4, 5],[8, 6, 1]]

ผลลัพธ์

4