Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมหาคะแนนสูงสุดจากการลบกลุ่มตัวเลขติดกันใน Python

ได้รับลิสต์จำนวนบวก ลบ sublist ติดกันที่มีค่าเท่ากัน ความยาว t ได้คะแนน t² ทำซ้ำจนลิสต์ว่าง หา คะแนนสูงสุด

ตัวอย่าง

Input: [4, 4, 6, 4, 4]

Output: 17

ลบ 6 (t=1) → 1 แล้วเหลือ [4,4,4,4] (t=4) → 16 รวม 17

แนวทางแก้ปัญหา

Interval DP (DP on intervals):

  • State: dp(l, r, k) = คะแนนสูงสุดในช่วง [l, r] โดยมี k ตัวเท่ากับ nums[l] ต่ออยู่ด้านซ้าย (outside)
  • Base: l > r → 0
  • Merge ตัวเดียวกันติดกัน: ขยาย l ไปขวา รวม k
  • สองทางเลือก:
    • ลบกลุ่มนี้เลย: (k+cnt)² + dp(l+cnt, r, 0)
    • หาตัวกลางที่เท่ากัน merge ต่อ: max(dp(l+cnt, m-1, 0) + dp(m, r, k+cnt))

การใช้งาน (Python)

from functools import lru_cache

class Solution:
    def solve(self, nums):
        @lru_cache(None)
        def dp(l, r, k):
            if l > r:
                return 0
            
            # รวมตัวติดกันที่เท่ากับ nums[l]
            val = nums[l]
            l2 = l
            while l2 < r and nums[l2 + 1] == val:
                l2 += 1
            cnt = l2 - l + 1
            new_l = l2 + 1
            new_k = k + cnt
            
            # Option 1: ลบกลุ่มนี้ตอนนี้
            best = new_k * new_k + dp(new_l, r, 0)
            
            # Option 2: หาตัวกลาง merge ต่อ
            for m in range(new_l, r + 1):
                if nums[m] == val:
                    best = max(best, dp(new_l, m - 1, 0) + dp(m, r, new_k))
            
            return best
        
        return dp(0, len(nums) - 1, 0)

# ทดสอบ
ob = Solution()
print(ob.solve([4, 4, 6, 4, 4]))  # Output: 17

ความซับซ้อน

  • Time Complexity: O(N³) หรือ O(N⁴) ขึ้นกับการ implement
  • Space Complexity: O(N³) สำหรับ memo

เป็นปัญหา "Remove Boxes" (LeetCode 546) รุ่นง่ายขึ้น