(n/2)*n - это какая сложность?
это k-кратный, кмк...
ещё же есть итерирование на каждом шаге именно внутри тела цикла нескольких элементов в зависимости от входного параметра:
Линейный - это когда в худшем случае количество любых смещений при переборе элементов списка не превышает количества элементов этого списка.
тут может быть выход за границы массива, это надо учесть
8 3
1 2 3 4 1 6 7 8 1 1 9 11 7 14
minA: [1, 2, 1, 1, 1, 6, 1, 1, 1, 1, 7, 7]
defA: [6, 18, 8, 11, 14, 126, 16, 10, 11, 21, 189, 224, 0, 0]
defA: [6, 18, 8, 11, 14, 126, 16, 10, 11, 21, 189, 224, 0, 0]
maxDef: [1, 1, 4, 5, 5, 5, 6, 9, 10, 11, 11, 11]
best next: [5, 5, 5, 6, 9, 10, 11, 11, 11]
summ: [356, 368, 358, 251, 238, 350, 240, 234, 235, 224, 224, 224]
start chain: 1
def: [6, 18, 8, 11, 14, 126]
maxDef: [1, 1, 4, 5, 5, 5, 5]
best next: [5, 5, 5]
summ: [132, 144, 134, 126, 126, 126]
Последние k элементов заносятся в кэш как есть, от них никуда не деться.
Далее для каждого элемента с номером i нужно просмотреть, как он сочетается с элементами i + k .. i + 2k
И так идём до первого элемента. Потом выбираем лучший из элементов с номерами 1 .. k
в один проход?
храня промежуточные результаты в матрице и оптимизируя очередью или стеком.
Я имел ввиду, на ограничения количества элементов, из которых составляется сумма. Если нет - то все очень не радужно. Метод "ветвей и границ" точного решения не гарантирует.
Надеюсь, про O(n) это вы пошутили.
На самом деле надо пробовать в каждой конкретной ситуации, и файлы не редко окажутся в выигрыше.