ЗАДАЧИ
problems.ru
О проекте | Об авторах | Справочник
Каталог по темам | по источникам |
К задаче N

Проект МЦНМО
при участии
школы 57
Задача 76270
Тема:    [ Динамическое программирование: классические задачи ]
Сложность: 2+
Классы:
В корзину
Прислать комментарий

Условие

Даны две последовательности x[1]...x[n] и  y[1]...y[k] целых чисел. Найти максимальную длину последовательности, являющейся подпоследовательностью обеих последовательностей. Количество операций порядка n . k.

Решение

(Cообщено М. Н.Вайнцвайгом, А.М.Диментманом). Обозначим через f(p,q) максимальную длину общей подпоследовательности последовательностей x[1]...x[p] и  y[1]...y[q]. Тогда

x[p]$\displaystyle \ne$y[q] $\displaystyle \Rightarrow$ f(p,q) = max (f(p,q - 1),f(p - 1,q));  
x[p] = y[q] $\displaystyle \Rightarrow$ f(p,q) = max (f(p,q - 1),f(p - 1,q),f(p - 1,q - 1) + 1);  

Поскольку f(p - 1,q - 1) + 1≥f(p,q - 1),f(p - 1,q), во втором случае максимум трёх чисел можно заменить на третье из них.) Поэтому можно заполнять таблицу значений функции f, имеющую размер n . k. Можно обойтись и памятью порядка k (или n), если индуктивно (по p) вычислять <f(p,0), ..., f(p,k)> (как функция от p этот набор индуктивен).

Источники и прецеденты использования

книга
Автор А.Шень
Название Программирование: теоремы и задачи
Издательство МЦНМО
Издание второе
Год издания 2004
глава
Номер 1
Название Переменные, выражения, присваивания
параграф
Номер 3
Название Индуктивные функции (по А.Г.Кушниренко)
задача
Номер 1.3.3

© 2004-... МЦНМО (о копирайте)
Пишите нам

Проект осуществляется при поддержке Департамента образования г.Москвы и ФЦП "Кадры" .