Сегодня решим сложную задачу на динамическое программирование про поиск уникальных подпоследовательностей. Читаем условие: Сложность задачи складывается из нескольких пунктов: Напомню, что подстрока - это непрерывная последовательность символов с i-го до j-го. Или, на языке Python - это слайс s[i:j]. А подпоследовательность - это любая последовательность, которая может быть получена из исходной вычёркиванием произвольного числа символов. Количество подстрок O(N^2), а количество подпоследовательностей O(2^N), поэтому перебрать все не получится. Уникальность последовательностей заставляет как-то учитывать уже посчитанные. Например из последовательности "()()" можно получить "()" тремя разными способами, но в ответ засчитывается только один. А из первого пункта получается, что подпоследовательностей очень много, поэтому запомнить учтённые не получится. Значит надо сразу считать без повторений. Для динамического программирования на скобочные последовательности состоянием чаще всего выбираю