สมมติว่าเราได้รับรายการจำนวนบวก ตอนนี้ เราสามารถลบรายการย่อยที่ต่อเนื่องกันของความยาว t ที่มีค่าเท่ากัน และรับคะแนน t * t เงื่อนไขหนึ่งที่ต้องพิจารณาคือ เราสามารถดำเนินการนี้กี่ครั้งก็ได้จนกว่ารายการจะว่างเปล่า ดังนั้นเราต้องกำหนดจำนวนคะแนนสูงสุดที่เราจะได้รับ
ดังนั้น หากอินพุตเป็น nums =[4, 4, 6, 4, 4] เอาต์พุตจะเป็น 17
สำหรับผลลัพธ์ ก่อนอื่นเราสามารถลบ 6 ซึ่งมีความยาว 1 และให้ผลลัพธ์ 1 * 1 =1 จุด จากนั้นเราสามารถเอารายการ [4, 4, 4, 4] ซึ่งมีความยาว 4 และให้ผล 4 * 4 =16 คะแนน ในที่สุด เราก็ได้ 17 แต้ม
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน dp() นี่จะเป็นทางซ้าย ขวา t
-
ถ้า left> right ไม่ใช่ศูนย์ ดังนั้น
-
คืนค่า 0
-
-
num :=nums[ซ้าย]
-
left2 :=ซ้าย
-
ในขณะที่ left2
-
left2 :=left2 + 1
-
-
t :=t + left2 − left + 1
-
ซ้าย :=left2 + 1
-
คะแนน :=t ยกกำลัง 2 + dp(ซ้าย, ขวา, 0)
-
สำหรับช่วงกลางจากซ้ายไปขวา + 1 ทำ
-
ถ้า nums[mid] เท่ากับ num แล้ว
-
คะแนน :=สูงสุดของ (จุด, dp(ซ้าย, กลาง − 1, 0) + dp(กลาง, ขวา, t))
-
-
-
จุดกลับ
-
จากหน้าที่หลัก เราทำสิ่งต่อไปนี้ -
-
พิมพ์(dp(0, ขนาดของ nums − 1, 0))
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
class Solution: def solve(self, nums): def dp(left, right, t): if left > right: return 0 num = nums[left] left2 = left while left2 < right and nums[left2 + 1] == num: left2 += 1 t += left2 − left + 1 left = left2 + 1 points = t ** 2 + dp(left, right, 0) for mid in range(left, right + 1): if nums[mid] == num: points = max(points, dp(left, mid − 1, 0) + dp(mid, right, t)) return points return dp(0, len(nums) − 1, 0) ob1 = Solution() print(ob1.solve([4, 4, 6, 4, 4]))
อินพุต
[4, 4, 6, 4, 4]
ผลลัพธ์
17