สมมติว่าเรามีรายการหมายเลขที่เรียกว่าลูกกวาด และคนสองคนกำลังแข่งกันเก็บลูกกวาดให้ได้มากที่สุด ที่นี่การแข่งขันเป็นแบบผลัดกันเล่น คนที่ 1 จะเริ่มก่อน และในแต่ละตาเขาสามารถรับลูกกวาดจากด้านหน้าหรือด้านหลังได้ ต้องเช็คก่อนว่าคนที่ 1 จะเก็บลูกกวาดได้มากกว่าที่อื่นหรือไม่
ดังนั้นหากอินพุตเป็นเหมือนแคนดี้ =[1, 4, 3, 8] ผลลัพธ์จะเป็น จริง เนื่องจากคนที่ 1 สามารถรับ 8 แคนดี้ได้ในรอบแรก และไม่ว่าคนที่สองจะเลือก 1 หรือ 3 ก็ตาม คนที่ 1 สามารถชนะได้โดยเอาลูกอมที่เหลือไป
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
N :=ขนาดของลูกอม
-
กำหนดความแตกต่างของฟังก์ชัน () นี่จะเป็นทางซ้าย ขวา
-
ถ้าซ้ายเหมือนกับขวา แล้ว
-
คืนลูกกวาด[ซ้าย]
-
-
ผลตอบแทนสูงสุดของ (candies[left] − Difference(left + 1, right)) และ (candies[right] − Difference(left, right − 1))
-
จากวิธีหลักให้ทำดังต่อไปนี้ -
-
คืนค่า จริง เมื่อผลต่าง (0, N - 1)> 0 มิฉะนั้น เท็จ
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
class Solution: def solve(self, candies): N = len(candies) def difference(left, right): nonlocal candies if left == right: return candies[left] return max(candies[left] − difference(left + 1, right), candies[right] − difference(left, right − 1)) return difference(0, N − 1) > 0 ob = Solution() candies = [1, 4, 3, 8] print(ob.solve(candies))
อินพุต
[1, 4, 3, 8]
ผลลัพธ์
True