Minimum Cost to Cut Board into Squares
กระดานขนาด p x q ต้องตัดเป็น p*q สี่เหลี่ยมจัตุรัสขนาด 1x1 ต้นทุนการตัดแต่ละขอบกำหนดให้ (Horizontal cuts และ Vertical cuts) ต้องการหาลำดับการตัดที่ให้ต้นทุนรวมน้อยที่สุด
ตัวอย่าง: X_slice = [3,2,4,2,5] (ต้นทุนตัดแนวนอน), Y_slice = [5,2,3] (ต้นทุนตัดแนวตั้ง) → ต้นทุนต่ำสุด = 65
กลยุทธ์ Greedy
- เรียงต้นทุนตัดทั้งสองแนวจากมากไปน้อย
- เลือกตัดขอบที่มีต้นทุนสูงสุดก่อน (เพราะจะคูณกับจำนวนชิ้นที่น้อยกว่า)
- เก็บจำนวนชิ้นแนวนอน (
horizontal) และแนวตั้ง (vertical) ปัจจุบัน - เมื่อตัดแนวนอน: ต้นทุน +=
X_slice[i] * vertical,horizontal++ - เมื่อตัดแนวตั้ง: ต้นทุน +=
Y_slice[j] * horizontal,vertical++ - ตัดขอบที่เหลือทีละขอบ
โค้ดตัวอย่าง Python
def minCost(X_slice, Y_slice, m, n):
X_slice.sort(reverse=True)
Y_slice.sort(reverse=True)
horizontal = vertical = 1
i = j = 0
res = 0
while i < m and j < n:
if X_slice[i] > Y_slice[j]:
res += X_slice[i] * vertical
horizontal += 1
i += 1
else:
res += Y_slice[j] * horizontal
vertical += 1
j += 1
while i < m:
res += X_slice[i] * vertical
i += 1
while j < n:
res += Y_slice[j] * horizontal
j += 1
return res
X = [3,2,4,2,5]
Y = [5,2,3]
print(minCost(X, Y, len(X), len(Y))) # 65