मान लीजिए कि हमारे पास nums नामक एक सरणी है और दूसरा मान k है। एक खंड का एक्सओआर [बाएं, दाएं] (बाएं <=दाएं) उन सभी तत्वों का एक्सओआर है जिनके सूचकांक बाएं और दाएं (समावेशी) के बीच हैं।
हमें ऐरे में बदलने के लिए तत्वों की न्यूनतम संख्या इस तरह ढूंढनी होगी कि आकार k के सभी खंडों का XOR शून्य के समान हो।
इसलिए, यदि इनपुट संख्या =[3,4,5,2,1,7,3,4,7], के =3 की तरह है, तो आउटपुट 3 होगा क्योंकि हम सूचकांक 2, 3 पर तत्वों को संशोधित कर सकते हैं, 4 सरणी बनाने के लिए [3,4,7,3,4,7,3,4,7]।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
सीमा :=1024
-
अस्थायी:=एक सरणी बनाएं जिसका आकार LIMIT x k है, और 0 से भरें
-
प्रत्येक अनुक्रमणिका के लिए i और मान x अंकों में, करें
-
अस्थायी [मैं मॉड के, एक्स]:=अस्थायी [मैं मॉड के, एक्स] + 1पी>
-
-
dp:=आकार की एक सरणी LIMIT और -2000 से भरें
-
डीपी [0] :=0
-
अस्थायी में प्रत्येक पंक्ति के लिए, करें
-
मैक्सप्रेव :=अधिकतम डीपी
-
new_dp :=आकार की एक सरणी LIMIT और maxprev से भरें
-
प्रत्येक अनुक्रमणिका i और मान cnt पंक्ति के लिए, करें
-
अगर cnt> 0, तो
-
प्रत्येक अनुक्रमणिका j और dp में प्रचलित मान के लिए, करें
-
new_dp[i XOR j] :=अधिकतम new_dp[i XOR j] और पिछला+cnt
-
-
-
-
डीपी:=new_dp
-
-
अंकों का वापसी आकार - 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