После завершения первого (двойного) цикла q[i]
- это длина самой длинной увеличивающейся подпоследовательности, заканчивающейся в позиции i
.
Чтобы увидеть, как работает двойной цикл, предположим, что q[j]
уже содержитдлина наибольшей увеличивающейся подпоследовательности, заканчивающейся в позиции j
, но только для j
между 0
и k-1
.Учитывая это, как бы вы вычислили q[k]
?
Ну, вы бы нашли все j
с j < k
и a[j] < a[k]
, посмотрите, какое из соответствующих значений q[j]
было наибольшим, добавьтеодин и спрятать это значение в q[k]
.Это именно то, что делает внутренний цикл.
Поэтому при входе во внутренний цикл q[j]
уже имеет правильные значения для j в диапазоне от 0
до k-1
.И на выходе, он также имеет правильное значение для k
.Таким образом, к моменту выхода из двойного цикла, q[i]
имеет правильное значение для всех i
между 0
и n
.
Последний цикл просто выбирает самый большой из них, что является ответом.