Общие конспекты

тема: DP 2D · уровень: продвинутый

Условие

В школе два ученика вели конспект по одному предмету, но каждый записывал только «важные» слова. В итоге у каждого получилась строка из латинских букв без пробелов.

Учитель хочет понять, насколько их конспекты похожи: какое максимальное количество букв можно прочитать в обоих конспектах в одном и том же порядке, если разрешено вычёркивать любые буквы (возможно, разные) из каждой строки.

Найдите это максимальное количество.

Формат ввода

Даны две строки s и t, каждая в отдельной строке.

Формат вывода

Выведите одно целое число — максимальную длину общей подпоследовательности строк s и t.

Ограничения

Пример

Ввод:

abcbdab
bdcaba

Вывод:

4

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

Приём: Динамическое программирование по двум строкам (LCS)

Ключевое наблюдение: нас интересует не подстрока (не обязаны идти подряд), а подпоследовательность — можно вычёркивать буквы. Значит, решение зависит только от того, как «лучший ответ» меняется при добавлении очередной буквы в одну из строк.

Приём: динамическое программирование по префиксам. Пусть dp[i][j] — максимальная длина общей подпоследовательности для s[:i] и t[:j]. Тогда последний шаг всегда один из трёх:

Мини-формула (ядро перехода):

План решения:

Сложность: O(m*n) по времени (до 160000 операций при 400x400) и O(n) памяти при «двух строках».

Частая ошибка: обновлять массив «на месте» и случайно портить значение dp[i-1][j-1]. Если используешь оптимизацию памяти — считай cur[j] только из prev[...] и cur[j-1], а prev заменяй на cur только после завершения всей строки j=1..n.

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

Куда дальше