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

โปรแกรมหาความยาว LIS ที่มีค่าเลขคี่อย่างน้อย K ตัวใน Python

ได้รับลิสต์ตัวเลข nums และค่า k หา ความยาวของ Longest Increasing Subsequence (LIS) ที่มี จำนวนเลขคี่ ≥ k

ตัวอย่าง

Input: nums = [12, 14, 16, 5, 7, 8], k = 2

Output: 3 (LIS คือ [5, 7, 8] มีเลขคี่ 2 ตัว คือ 5, 7)

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

ใช้ DFS + Backtracking (เหมาะสำหรับ N ≤ ~20):

  • State: dp(i, j, odd, taken) โดย
    • i = index ตัวสุดท้ายที่เลือก
    • j = index กำลังพิจารณา
    • odd = จำนวนเลขคี่ที่เลือกแล้ว
    • taken = จำนวนตัวที่เลือกแล้ว
  • ถ้า odd ≥ k → อัปเดตคำตอบ
  • ลองเลือก nums[j] ถ้า > nums[i] หรือ ข้ามไป

หมายเหตุ: สำหรับ N ใหญ่ควรใช้ DP + BIT/Segment Tree แบบ O(N log N)

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

class Solution:
    def solve(self, nums, k):
        best = 0
        n = len(nums)
        
        def dp(i, j, odd, taken):
            nonlocal best
            if odd >= k:
                best = max(best, taken)
            if j == n:
                return
            if nums[j] > nums[i]:
                dp(j, j + 1, odd + (nums[j] & 1), taken + 1)
            dp(i, j + 1, odd, taken)
        
        for i in range(n):
            dp(i, i + 1, nums[i] & 1, 1)
        return best

# ทดสอบ
ob = Solution()
print(ob.solve([12, 14, 16, 5, 7, 8], 2))  # Output: 3

ความซับซ้อน

  • Time Complexity: O(2^N) แบบ brute force
  • Space Complexity: O(N) recursion stack

แนะนำ: ใช้ DP + Fenwick Tree บนค่าที่ compress แล้ว เพื่อ O(N log N)