Мы можем использовать динамическое программирование здесь, чтобы разбить задачу на меньшие множества, а затем сохранить их результат в таблице. Затем используйте уже сохраненный результат, чтобы вычислить ответ для большего набора. Например:
Input -- [1,2,1,2,1,2]
Нам нужно последовательно разделить массив на 4 блока, чтобы сумма XOR всех блоков была максимизирована. Давайте возьмем ваш тестовый пример, разбейте задачу на меньшие множества и начните решать для меньшего множества.
box = 1, num = [1,2,1,2,1,2]
ans = 1 3 2 0 1 3
Так как у нас есть только одна коробка, все числа войдут в эту коробку. Мы будем хранить этот ответ в таблице. Давайте назовем матрицу как DP.
DP[1] = [1 3 2 0 1 3]
DP[i][j] stores answer for distributing 0-j numbers to i boxes.
Теперь давайте возьмем случай, когда у нас есть два поля, и мы будем брать числа один за другим.
num = [1] since we only have one number it will go into the first box.
DP[1][0] = 1
Позволяет добавить еще один номер.
num = [1 2]
теперь есть два способа поместить этот новый номер в коробку.
case 1: 2 will go to the First box. Since we already have answer
for both numbers in one box. we will just use that.
answer = DP[0][1] + 0 (Second box is empty)
case 2: 2 will go to second box.
answer = DP[0][0] + 2 (only 2 is present in the second box)
Максимум двух случаев будет сохранен вDP [1] [1].
DP[1][1] = max(3+0, 1+2) = 3.
Теперь для num = [1 2 1]. Опять же, для нового номера у нас есть три случая.
box1 = [1 2 1], box2 = [], DP[0][2] + 0
box1 = [1 2], box2 = [1], DP[0][1] + 1
box1 = [1 ], box2 = [2 1], DP[0][0] + 2^1
Максимум этих трех будет ответом для DP [1] [2].
Аналогично мы можем найти ответ num = [12 1 2 1 2] box = 4
1 3 2 0 1 3
1 3 4 6 5 3
1 3 4 6 7 9
1 3 4 6 7 9
Также обратите внимание, что a xor b xor a = b
. вы можете использовать это свойство, чтобы получить xor сегмента массива за постоянное время, как это предлагается в комментариях. Таким образом, вы можете разбить задачу на меньшее подмножество и использовать меньший набор ответов, чтобы вычислить для больших. Надеюсь это поможет. После понимания концепции вы можете пойти дальше и реализовать ее быстрее, чем экспоненциально.