Задача о наибольшей общей палиндромной подпоследовательности — различия между версиями
| Строка 1: | Строка 1: | ||
| + | {| class="wikitable" align="center" style="color: red; background-color: black; font-size: 56px; width: 800px;" | ||
| + | |+ | ||
| + | |-align="center" | ||
| + | |'''НЕТ ВОЙНЕ''' | ||
| + | |-style="font-size: 16px;" | ||
| + | | | ||
| + | 24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян. | ||
| + | |||
| + | Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием. | ||
| + | |||
| + | Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей. | ||
| + | |||
| + | Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить. | ||
| + | |||
| + | ''Антивоенный комитет России'' | ||
| + | |-style="font-size: 16px;" | ||
| + | |Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению. | ||
| + | |-style="font-size: 16px;" | ||
| + | |[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки]. | ||
| + | |} | ||
| + | |||
'''[[Задача о наибольшей общей подпоследовательности]]''' (англ. ''longest common subsequence (LCS)'') {{---}} классическая и хорошо изученная проблема. | '''[[Задача о наибольшей общей подпоследовательности]]''' (англ. ''longest common subsequence (LCS)'') {{---}} классическая и хорошо изученная проблема. | ||
Версия 07:02, 1 сентября 2022
| НЕТ ВОЙНЕ |
|
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян. Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием. Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей. Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить. Антивоенный комитет России |
| Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению. |
| meduza.io, Популярная политика, Новая газета, zona.media, Майкл Наки. |
Задача о наибольшей общей подпоследовательности (англ. longest common subsequence (LCS)) — классическая и хорошо изученная проблема.
Задача о наибольшей подпоследовательности-палиндроме (англ. longest palindromic subsequence (LPS)) — также хорошо изучена.
Здесь мы рассмотрим задачу, которая объединяет две вышеперечисленные задачи в одну.
| Определение: |
| Для последовательности , мы обозначим её подпоследовательность как . Для двух последовательностей и , если общая подпоследовательность последовательностей и является палиндромом, то называется общей подпалиндромной подпоследовательностью (англ. common palindromic subsequence). Общая подпалиндромная последовательность, имеющая максимальную длину, называется наибольшей общей подпалиндромной подпоследовательностью (англ. longest common palindromic subsequence (LCPS)) и мы обозначим её как . |
| Задача: |
| Наибольшая общая подпалиндромная подпоследовательность — задача, являющаяся интересным вариантом классической задачи о поиске наибольшей общей подпоследовательности, которая также накладывает условия, что эта подпоследовательность должна быть палиндромом. |
Содержание
Наивное решение
Можно придумать такое решение данной задачи: найти наибольшую общую подпоследовательность, в ней найти наибольшую подпалиндромную подпоследовательность. Но, к сожалению, это решение неверно.
Контрпример
Возьмем две последовательности и .
Наибольшей общая подпоследовательность данных последовательностей равна и в ней наибольшая подпалиндромная последовательность имеет длину .
Но очевидно, что на самом деле последовательность является наибольшим общей палиндромной подпоследовательностью и и имеет длину .
Решение с помощью динамического программирования
Заметим, что в качестве подзадач для , в которых мы можем посчитать ответ, логично взять подпоследовательность от и от . Основываясь на этом наблюдении мы сформулируем следующую теорему, которая доказывает оптимальную подструктуру свойств задачи , что даст возможность воспользоваться идеей динамического программирования.
| Теорема: |
Пусть и — две последовательности длин и соответственно, а и — две подпоследовательности последовательностей и соответственно. Пусть — наибольшая общая подпалиндромная последовательность двух подпоследовательностей и . Тогда выполняются следующие утверждения,
|
На основании теоремы мы напишем следующую рекурсивную формулу для длины наибольшей общей подпалиндромной подпоследовательности:
Где — длина наибольшей общей палиндромной подпоследовательности от и . Длина наибольшей общей палиндромной подпоследовательности от последовательностей и будет расположена в . Мы можем вычислить эту длину за время используя динамическое программирование.
Реализация
Будем использовать динамику с запоминанием ответа (с мемоизацией). Оформим решения в виде рекурсивной функции , которая возвращает ответ для подзадачи, на которую она была вызвана.
В массиве хранятся ответы для подзадач. До запуска функции заполним массив значением . Так как каждое значение считается не более одного раза и эта операция происходит за , мы получим асимптотику .
Псевдокод
int lcps(i: int, j: int, k: int, l: int) if (ans[i][j][k][l] -1) // если значение уже посчитано, то надо его вернуть return ans[i][j][k][l] if (i > j or k > l) ans[i][j][k][l] = 0 return 0 if (X[i] == X[j] == Y[k] == Y[l]) if (i == j and k == l) ans[i][j][k][l] = 1 return 1 else ans[i][j][k][l] = (2 + lcps(i + 1, j - 1, k + 1, l - 1)) return ans[i][j][k][l] ans[i][j][k][l] = max(lcps(i + 1, j, k, l), lcps(i, j - 1, k, l), lcps(i, j, k + 1, l), lcps(i, j, k, l - 1)) return ans[i][j][k][l]
См. также
- Задача о наибольшей возрастающей подпоследовательности
- Задача о редакционном расстоянии, алгоритм Вагнера-Фишера