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

แบ่งอาร์เรย์เพื่อผลรวมสูงสุด (Partition Array for Maximum Sum) ใน Python

โจทย์: กำหนดอาร์เรย์ A แบ่งเป็น subarrays ต่อเนื่องยาวสูงสุด K แต่ละ subarray จะเปลี่ยนค่าทุกตัวเป็นค่าสูงสุดใน subarray นั้น หาผลรวมสูงสุดหลังแบ่ง

ตัวอย่าง

Input: A = [1, 15, 7, 9, 2, 5, 10], K = 3
Output: 84 (แบ่งเป็น [1,15,7] [9] [2,5,10] → [15,15,15] [9] [10,10,10] = 84)

อัลกอริทึม: Dynamic Programming

dp[i] = ผลรวมสูงสุดสำหรับ prefix A[0..i]

Transition: ลองทุกความยาว subarray ที่จบที่ i (1 ถึง K)

ตัวอย่างโค้ด Python

class Solution(object):
    def maxSumAfterPartitioning(self, A, K):
        n = len(A)
        dp = [0] * n
        
        for i in range(n):
            # กรณี subarray ยาว 1
            dp[i] = A[i] + (dp[i-1] if i > 0 else 0)
            max_val = A[i]
            
            # ลอง subarray ยาว 2 ถึง K
            for j in range(1, K):
                if i - j >= 0:
                    max_val = max(max_val, A[i - j])
                    # ค่า subarray = max_val * length + dp[before_subarray]
                    prev = dp[i - j - 1] if i - j - 1 >= 0 else 0
                    dp[i] = max(dp[i], max_val * (j + 1) + prev)
        
        return dp[-1]

# ทดสอบ
ob = Solution()
print(ob.maxSumAfterPartitioning([1,15,7,9,2,5,10], 3))  # Output: 84

ตัวอย่าง Input/Output

Input: [1,15,7,9,2,5,10] 3
Output: 84

ความซับซ้อน: Time O(n×K), Space O(n)