Комбо-стрик

тема: DP 1D · уровень: средний

Условие

В ритм-игре за каждый уровень тебе начисляют целое число очков. Тренер говорит: «Красивое комбо — это когда ты выбираешь несколько сыгранных уровней *в том же порядке*, и в каждом следующем выбранном уровне очков строго больше, чем в предыдущем».

Найди максимальную длину такого комбо.

Формат ввода

Формат вывода Выведи одно целое число — максимальную возможную длину комбо (длину самой длинной строго возрастающей подпоследовательности).

Ограничения

Пример Ввод:

8
5 1 6 2 3 4 0 7

Вывод:

5

Пояснение: например, можно выбрать уровни с очками 1, 2, 3, 4, 7.

Как решать — идея подхода

Приём: DP 1D (длина ЛВП, заканчивающейся в i)

Ключевое наблюдение: если комбо заканчивается на уровне i, то предыдущий выбранный уровень должен быть где-то раньше (j < i) и иметь меньшие очки (a[j] < a[i]). Значит, лучшая цепочка в i получается как «лучшая цепочка в каком-то подходящем j + 1».

Это классическая динамика (DP): храним ответ для каждого конца подпоследовательности и постепенно наращиваем.

План:

Мини-сниппет формулы перехода: dp[i] = max(dp[i], dp[j] + 1) при a[j] < a[i].

Сложность: два вложенных цикла дают O(n^2), при n ≤ 2500 это проходит.

Частая ошибка: перепутать «строго» и «нестрого». Тут нужно именно a[j] < a[i], равные значения продолжать нельзя.

Решить задачу с автопроверкой на Python →

Куда дальше