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

โปรแกรมที่จะทำให้ XOR ของเซ็กเมนต์ทั้งหมดเท่ากับศูนย์ใน Python


สมมติว่าเรามีอาร์เรย์ที่เรียกว่า nums และอีกค่าหนึ่งคือ k XOR ของเซ็กเมนต์ [left, right] (left <=right) คือ XOR ขององค์ประกอบทั้งหมดที่มีดัชนีอยู่ระหว่างซ้ายและขวา (รวม)

เราต้องหาจำนวนองค์ประกอบขั้นต่ำที่จะเปลี่ยนในอาร์เรย์เพื่อให้ XOR ของทุกส่วนของขนาด k เท่ากับศูนย์

ดังนั้น หากอินพุตเป็น nums =[3,4,5,2,1,7,3,4,7], k =3 แล้วผลลัพธ์จะเป็น 3 เพราะเราสามารถแก้ไของค์ประกอบที่ดัชนี 2, 3, 4 เพื่อสร้างอาร์เรย์ [3,4,7,3,4,7,3,4,7].

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • LIMIT :=1024

  • temp :=สร้างอาร์เรย์ที่มีขนาด LIMIT x k และเติมด้วย 0

  • สำหรับแต่ละดัชนี i และค่า x เป็น nums ทำ

    • อุณหภูมิ[i mod k, x] :=อุณหภูมิ[i mod k, x] + 1

  • dp :=อาร์เรย์ขนาด LIMIT และเติมด้วย -2000

  • dp[0] :=0

  • สำหรับแต่ละแถวในอุณหภูมิ ให้ทำ

    • maxprev :=สูงสุดของ dp

    • new_dp :=อาร์เรย์ขนาด LIMIT และเติม maxprev

    • สำหรับแต่ละดัชนี i และค่า cnt แถว ทำ

      • ถ้า cnt> 0 แล้ว

        • สำหรับแต่ละดัชนี j และค่าก่อนหน้าใน dp ทำ

          • new_dp[i XOR j] :=สูงสุดของ new_dp[i XOR j] และ prev+cnt

    • dp :=new_dp

  • ขนาดส่งคืนของ nums - new_dp[0]

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น

def solve(nums, k):
   LIMIT = 2**10
   temp = [[0 for _ in range(LIMIT)] for _ in range(k)]
   for i,x in enumerate(nums):
      temp[i%k][x] += 1

   dp = [-2000 for _ in range(LIMIT)]
   dp[0] = 0
   for row in temp:
      maxprev = max(dp)
      new_dp = [maxprev for _ in range(LIMIT)]
      for i,cnt in enumerate(row):
         if cnt > 0:
            for j,prev in enumerate(dp):
               new_dp[i^j] = max(new_dp[i^j], prev+cnt)
         dp = new_dp
   return len(nums) - new_dp[0]

nums = [3,4,5,2,1,7,3,4,7]
k = 3
print(solve(nums, k))

อินพุต

[3,4,5,2,1,7,3,4,7], 3

ผลลัพธ์

-9