สมมติว่าเรามีอาร์เรย์ที่เรียกว่า 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