สมมติว่าเรามีเมทริกซ์ 2 มิติและค่าอื่นๆ เช่น row, col, erow0, ecol0, erow1 และ ecol1 หากตำแหน่งปัจจุบันของเราคือเมทริกซ์ [row, col] และเราต้องการรับทองคำที่อยู่ที่เมทริกซ์ [erow0, ecol0] และเมทริกซ์ [erow1, ecol1] เราสามารถขึ้น ลง ซ้าย และขวาได้ แต่เมื่อเราอยู่ที่เซลล์ (r, c) เราต้องจ่ายเมทริกซ์ต้นทุน [r, c] แม้ว่าเราจะลงจอดที่เซลล์มากกว่าหนึ่งครั้ง เราก็ไม่ ต้องจ่ายค่าใช้จ่ายสำหรับเซลล์นั้นอีกครั้ง เราต้องหาต้นทุนขั้นต่ำในการรับทองคำทั้งสองแห่ง
ดังนั้นหากอินพุตเป็นแบบ
1 | 1 | 1 | 1 | 1 |
1 | 10 | 10 | 10 | 10 |
1 | 1 | 1 | 10 | 10 |
แถว =0, col =0, erow0 =0, ecol0 =3, erow1 =2, ecol1 =2 แล้วเอาท์พุตจะเป็น 8 ตามที่เราอยู่ (0, 0) และต้องการเลือกทองจากตำแหน่ง (0, 3) และ (2, 2) ดังนั้นก่อนอื่นให้ย้ายจาก (0, 0) เป็น (0, 3) โดยสามขั้นตอนแล้วกลับมาที่ (0,0) จากนั้นไปที่ (2, 2) โดยทำตาม 1 เซลล์ที่ทำเครื่องหมายไว้
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน is_valid() นี่จะใช้เวลา x, y
-
คืนค่า จริง เมื่อ x และ y อยู่ในช่วงของเมทริกซ์ มิฉะนั้น จะเป็นเท็จ
-
กำหนดฟังก์ชัน min_cost() นี่จะใช้เวลา sx, sy
-
heap :=ฮีปที่มีไอเท็ม (เมทริกซ์[sx, sy], sx, sy)
-
diss :=เมทริกซ์ที่มีขนาดเท่ากันกับเมทริกซ์ที่กำหนดและเติมด้วย inf
-
diss[sx, sy] :=เมทริกซ์[sx, sy]
-
ขณะที่ฮีปไม่ว่างให้ทำ
-
(ราคา, x, y) :=องค์ประกอบแรกของฮีปและลบองค์ประกอบแรกออกจากฮีป
-
สำหรับแต่ละคู่ (nx, ny) ใน [(x, y - 1) ,(x + 1, y) ,(x - 1, y) ,(x, y + 1) ] ทำ
-
ถ้า is_valid(nx, ny) และ matrix[nx, ny] + cost
-
edge :=matrix[nx, ny]
-
diss[nx, ny] :=edge + cost
-
แทรก (ขอบ + ราคา, nx, ny) ลงในฮีป
-
-
-
-
ขากลับ
-
จากวิธีหลักให้ทำดังต่อไปนี้ -
-
res :=inf
-
a :=min_cost(row, col), b :=min_cost(erow0, ecol0), c :=min_cost(erow1, ecol1)
-
สำหรับฉันในช่วง 0 ถึงจำนวนแถวของเมทริกซ์ ทำ
-
สำหรับ j ในช่วง 0 ถึงจำนวนคอลัมน์ของเมทริกซ์ ให้ทำ
-
res :=ขั้นต่ำของ res และ (a[i, j] + b[i, j] + c[i, j] - 2 * matrix[i, j])
-
-
-
ผลตอบแทน
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
import heapqimport mathclass Solution:def Solve(ตัวเอง, เมทริกซ์, แถว, col, erow0, ecol0, erow1, ecol1):def is_valid(x, y):return x>=0 and y>=0 and xอินพุต
<ก่อนหน้า>[ [1, 1, 1, 1, 1], [1, 10, 10, 10, 10], [1, 1, 1, 10, 10]], 0, 0, 0, 3, 2 , 2
ผลลัพธ์
8