สมมติว่ามีรายการตัวเลข A และ B ความยาวเท่ากัน สามารถสลับ A[i] กับ B[i] ได้ ต้องการหาจำนวนการสลับน้อยที่สุดเพื่อให้ทั้งสองรายการเพิ่มขึ้นอย่างเคร่งครัด (strictly increasing)
ตัวอย่าง: A = [2, 8, 7, 10], B = [2, 4, 9, 10] ผลลัพธ์คือ 1 สลับ 7 กับ 9 ได้ A = [2, 8, 9, 10], B = [2, 4, 7, 10]
ขั้นตอนการแก้ปัญหา
- สร้างฟังก์ชัน DP
dp(i, prev_swapped):- ถ้า
i == len(A)คืน 0 - ถ้า
i == 0คืนmin(dp(1, False), 1 + dp(1, True)) - มิฉะนั้น:
prev_A = A[i-1],prev_B = B[i-1]- ถ้า
prev_swapped: สลับprev_A,prev_B - ถ้า
A[i] <= prev_AหรือB[i] <= prev_B: คืน1 + dp(i+1, True) - มิฉะนั้น:
ans = dp(i+1, False)- ถ้า
A[i] > prev_BและB[i] > prev_A:ans = min(ans, 1 + dp(i+1, True)) - คืน
ans
- ถ้า
- คืนค่า
dp(0, False)
ตัวอย่างโค้ด
class Solution:
def solve(self, A, B):
def dp(i=0, prev_swapped=False):
if len(A) == i:
return 0
elif i == 0:
return min(dp(i + 1), 1 + dp(i + 1, True))
else:
prev_A = A[i - 1]
prev_B = B[i - 1]
if prev_swapped:
prev_A, prev_B = prev_B, prev_A
if A[i] <= prev_A or B[i] <= prev_B:
return 1 + dp(i + 1, True)
else:
ans = dp(i + 1)
if A[i] > prev_B and B[i] > prev_A:
ans = min(ans, 1 + dp(i + 1, True))
return ans
return dp()
ob = Solution()
A = [2, 8, 7, 10]
B = [2, 4, 9, 10]
print(ob.solve(A, B))
อินพุต
[2, 8, 7, 10], [2, 4, 9, 10]
เอาต์พุต
1