1. 解题思路
这一题就是一个动态规划的思路。我们定义动态规划的状态函数dp(idx, k)
将数组arr[idx:]
切分为
k
k
k个子串之后能够获得的最大XOR的最小值。
此时,我们就能有状态转移函数:
d
p
(
i
,
k
)
=
m
i
n
j
=
i
+
1
n
−
k
(
m
a
x
(
X
O
R
(
a
r
r
[
i
:
j
]
,
d
p
(
j
,
k
−
1
)
)
)
)
dp(i, k) = \mathop{min}\limits_{j=i+1}^{n-k}(\mathop{max}(XOR(arr[i:j], dp(j, k-1))))
dp(i,k)=j=i+1minn−k(max(XOR(arr[i:j],dp(j,k−1))))
由此,我们即可写出动态规划函数,而最终答案就是 d p ( 0 , k ) dp(0, k) dp(0,k)。
2. 代码实现
给出python代码实现如下:
class Solution:
def minXor(self, nums: List[int], k: int) -> int:
n = len(nums)
@lru_cache(None)
def dp(idx, k):
if n-idx == k:
return max(nums[idx:])
elif k == 1:
ans = 0
for num in nums[idx:]:
ans = ans ^ num
return ans
ans, post = math.inf, 0
i, s = idx, 0
while i < n-k+1:
s = s ^ nums[i]
post = max(s, dp(i+1, k-1))
ans = min(ans, post)
i += 1
return ans
return dp(0, k)
提交代码评测得到:耗时8373ms,占用内存61.97MB。