//思路:1.arr上做分割,则dp记录从左到右每增加一个数划分得到的最大划分值
//对于第i个数的怎么求出呢:
//1.当i-1最后子数异或和不为0时,dp[i] = dp[i-1]
//2.当i-1为最后异或和时,dp[i] = dp[k-1]+1, K为上次距离i-1最近的一组异或和的
//最后一个数,则上一个异或和个数为dp[k-1],最近一次为arr[k....i-1]所以为dp[k-1]+1
//K的找出可以建立map来找出,map(异或和,arr的index)
public int mostEOR(int[] arr){
if(arr == null || arr.length == 0){
return 0;
}
int eor = 0;
int[] dp = new int[arr.length];
Map<Integer, Integer> map = new HashMap<>();
map.put(0, -1);
dp[0] = arr[0] == 0 ? 1 : 0;
map.put(dp[0], 0);
for(int i = 1; i < arr.length; i++){
eor ^= arr[i];
if(map.containsKey(eor)){
int eorIndexPre = map.get(eor);
dp[i] = eorIndexPre == -1 ? 1 : dp[eorIndexPre] + 1;
}
dp[i] = Math.max(dp[i], dp[i-1]);
map.put(dp[i], i);
}
return dp[dp.length-1];
}
子数组异或和为0最多的划分
最新推荐文章于 2022-07-04 14:11:11 发布