<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=193.34.232.21&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=193.34.232.21&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/193.34.232.21"/>
		<updated>2026-04-28T18:24:10Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8_%D0%94%D0%B0%D0%BC%D0%B5%D1%80%D0%B0%D1%83-%D0%9B%D0%B5%D0%B2%D0%B5%D0%BD%D1%88%D1%82%D0%B5%D0%B9%D0%BD%D0%B0&amp;diff=75116</id>
		<title>Задача о расстоянии Дамерау-Левенштейна</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B8_%D0%94%D0%B0%D0%BC%D0%B5%D1%80%D0%B0%D1%83-%D0%9B%D0%B5%D0%B2%D0%B5%D0%BD%D1%88%D1%82%D0%B5%D0%B9%D0%BD%D0%B0&amp;diff=75116"/>
				<updated>2020-11-03T14:54:55Z</updated>
		
		<summary type="html">&lt;p&gt;193.34.232.21: /* Корректный алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Расстояние Дамерау-Левенштейна''' (англ. ''Damerau-Levenshtein distance'') между двумя строками, состоящими из конечного числа символов {{---}} это минимальное число операций вставки, удаления, замены одного символа и транспозиции двух соседних символов, необходимых для перевода одной строки в другую.}}&lt;br /&gt;
Является модификацией [[Задача о редакционном расстоянии, алгоритм Вагнера-Фишера|расстояния Левенштейна]], отличается от него добавлением операции перестановки.&lt;br /&gt;
&lt;br /&gt;
==Практическое применение==&lt;br /&gt;
Расстояние Дамерау-Левенштейна, как и метрика Левенштейна, является мерой &amp;quot;схожести&amp;quot; двух строк. Алгоритм его поиска находит применение в реализации нечёткого поиска, а также в биоинформатике (сравнение ДНК), несмотря на то, что изначально алгоритм разрабатывался для сравнения текстов, набранных человеком (Дамерау показал, что 80% человеческих ошибок при наборе текстов составляют перестановки соседних символов, пропуск символа, добавление нового символа, и ошибка в символе. Поэтому метрика Дамерау-Левенштейна часто используется в редакторских программах для проверки правописания).   &lt;br /&gt;
&lt;br /&gt;
==Упрощённый алгоритм==&lt;br /&gt;
Не решает задачу корректно, но бывает полезен на практике.&lt;br /&gt;
&lt;br /&gt;
Здесь и далее будем использовать следующие обозначения: &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; {{---}} строки, между которыми требуется найти расстояние Дамерау-Левенштейна; &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; {{---}} их длины соответственно.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим алгоритм, отличающийся от алгоритма поиска расстояния Левенштейна одной проверкой (храним матрицу &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;D(i, j)&amp;lt;/tex&amp;gt; — расстояние между префиксами строк: первыми &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; символами строки &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; и первыми &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; символами строки &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;). Рекуррентное соотношение имеет вид:&lt;br /&gt;
&lt;br /&gt;
Ответ на задачу {{---}} &amp;lt;tex&amp;gt;D(M,N)&amp;lt;/tex&amp;gt; , где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;D(i, j) = \left\{\begin{array}{lllc}&lt;br /&gt;
\min{(A, D(i - 2, j - 2) + transposeCost)}&amp;amp;&amp;amp;;\ i &amp;gt; 1,\ j &amp;gt; 1,\ S[i] = T[j - 1],\ S[i - 1] = T[j]\\&lt;br /&gt;
A&amp;amp;&amp;amp;;\ \text{otherwise}\\&lt;br /&gt;
\end{array}\right.&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
A = \left\{\begin{array}{llcl}&lt;br /&gt;
0&amp;amp;;\ i = 0,\ j = 0\\&lt;br /&gt;
i * deleteCost&amp;amp;;\ j = 0,\ i &amp;gt; 0\\&lt;br /&gt;
j * insertCost&amp;amp;;\ i = 0,\ j &amp;gt; 0\\&lt;br /&gt;
D(i - 1, j - 1)&amp;amp;;\ S[i] = T[j]\\&lt;br /&gt;
\min{(}\\&lt;br /&gt;
\begin{array}{llcl}&lt;br /&gt;
&amp;amp;D(i, j - 1) + insertCost\\&lt;br /&gt;
&amp;amp;D(i - 1, j) + deleteCost&amp;amp;&amp;amp;\\&lt;br /&gt;
&amp;amp;D(i - 1, j - 1) + replaceCost\\&lt;br /&gt;
\end{array}&amp;amp;;\ j &amp;gt; 0,\ i &amp;gt; 0,\ S[i] \ne T[j]\\&lt;br /&gt;
)&lt;br /&gt;
\end{array}\right.&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом для получения ответа необходимо заполнить матрицу &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, пользуясь рекуррентным соотношением.&lt;br /&gt;
Сложность алгоритма: &amp;lt;tex&amp;gt;O\left (M \cdot N \right )&amp;lt;/tex&amp;gt;. Затраты памяти: &amp;lt;tex&amp;gt;O\left (M \cdot N \right)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 '''int''' DamerauLevenshteinDistance(S: '''char[1..M]''', T: '''char[1..N]'''; deleteCost, insertCost, replaceCost, transposeCost: '''int'''):&lt;br /&gt;
     d: '''int[0..M][0..N]'''&lt;br /&gt;
       &lt;br /&gt;
     ''&amp;lt;font color=green&amp;gt;// База динамики&amp;lt;/font&amp;gt;''&lt;br /&gt;
     d[0][0] = 0&lt;br /&gt;
     '''for''' i = 1 '''to''' M&lt;br /&gt;
         d[i][0] = d[i - 1][0] + deleteCost&lt;br /&gt;
     '''for''' j = 1 '''to''' N&lt;br /&gt;
         d[0][j] = d[0][j - 1] + insertCost&lt;br /&gt;
     &lt;br /&gt;
     '''for''' i = 1 '''to''' M&lt;br /&gt;
         '''for''' j = 1 '''to''' N           &lt;br /&gt;
             ''&amp;lt;font color=green&amp;gt;// Стоимость замены&amp;lt;/font&amp;gt;''&lt;br /&gt;
             '''if''' S[i] == T[j]&lt;br /&gt;
                d[i][j] = d[i - 1][j - 1]&lt;br /&gt;
             '''else'''&lt;br /&gt;
                d[i][j] = d[i - 1][j - 1] + replaceCost                   &lt;br /&gt;
             d[i][j] = min(&lt;br /&gt;
                              d[i][j],                                     ''&amp;lt;font color=green&amp;gt;// замена&amp;lt;/font&amp;gt;''&lt;br /&gt;
                              d[i - 1][j    ] + deleteCost,                ''&amp;lt;font color=green&amp;gt;// удаление&amp;lt;/font&amp;gt;''&lt;br /&gt;
                              d[i    ][j - 1] + insertCost                 ''&amp;lt;font color=green&amp;gt;// вставка&amp;lt;/font&amp;gt;''               &lt;br /&gt;
                          )&lt;br /&gt;
             '''if'''(i &amp;gt; 1 '''and''' j &amp;gt; 1 '''and''' S[i] == T[j - 1] '''and''' S[i - 1] == T[j])&lt;br /&gt;
                 d[i][j] = min(&lt;br /&gt;
                                   d[i][j],&lt;br /&gt;
                                   d[i - 2][j - 2] + transposeCost         ''&amp;lt;font color=green&amp;gt;// транспозиция&amp;lt;/font&amp;gt;''&lt;br /&gt;
                              )&lt;br /&gt;
     '''return''' d[M][N]&lt;br /&gt;
&lt;br /&gt;
Контрпример: &amp;lt;tex&amp;gt;S =&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;'CA'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T =&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;'ABC'&amp;lt;/tex&amp;gt;. Расстояние Дамерау-Левенштейна между строками равно &amp;lt;tex&amp;gt;2\ (CA \rightarrow AC \rightarrow ABC)&amp;lt;/tex&amp;gt;, однако функция приведённая выше возвратит &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;. Дело в том, что использование этого упрощённого алгоритма накладывает ограничение: любая подстрока может быть редактирована не более одного раза. Поэтому переход &amp;lt;tex&amp;gt;AC \rightarrow ABC&amp;lt;/tex&amp;gt; невозможен, и последовательность действий такая: &amp;lt;tex&amp;gt;(CA \rightarrow A \rightarrow AB \rightarrow ABC)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Упрощенный алгоритм Дамерау-Левенштейна не является метрикой, так как не выполняется правило треугольника: &amp;lt;tex&amp;gt;\mathtt{DLD}('CA',\ 'AC') + \mathtt{DLD}('AC',\ 'ABC') \ngeqslant \mathtt{DLD}('CA',\ 'ABC')&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Условие многих практических задач не предполагает многократного редактирования подстрок, поэтому часто достаточно упрощённого алгоритма. Ниже представлен более сложный алгоритм, который корректно решает задачу поиска расстояния Дамерау-Левенштейна.&lt;br /&gt;
&lt;br /&gt;
==Корректный алгоритм==&lt;br /&gt;
В основу алгоритма положена идея [[Динамическое программирование#.D0.9F.D1.80.D0.B8.D0.BD.D1.86.D0.B8.D0.BF_.D0.BE.D0.BF.D1.82.D0.B8.D0.BC.D0.B0.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8_.D0.BD.D0.B0_.D0.BF.D1.80.D0.B5.D1.84.D0.B8.D0.BA.D1.81.D0.B5|динамического программирования по префиксу]]. Будем хранить матрицу &amp;lt;tex&amp;gt;D[0..M + 1][0..N + 1]&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;D[i + 1][j + 1]&amp;lt;/tex&amp;gt; {{---}} расстояние Дамерау-Левенштейна между префиксами строк &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, длины префиксов {{---}} &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Для учёта транспозиции потребуется хранение следующей информации. Инвариант:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathtt{lastPosition}[x]&amp;lt;/tex&amp;gt; {{---}} индекс последнего вхождения &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathtt{last}&amp;lt;/tex&amp;gt; {{---}} на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й итерации внешнего цикла индекс последнего символа &amp;lt;tex&amp;gt;T: T[\mathtt{last}] = S[i]&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда если на очередной итерации внутреннего цикла положить: &amp;lt;tex&amp;gt;i' = \mathtt{lastPosition}[T[j]],\ j' = \mathtt{last}&amp;lt;/tex&amp;gt;, то&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;D(i, j) = \min{(A, D(i', j') + (i - i' - 1) \cdot deleteCost + transposeCost + (j - j' - 1) \cdot insertCost)}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
A = \left\{\begin{array}{llcl}&lt;br /&gt;
0&amp;amp;;\ i = 0,\ j = 0\\&lt;br /&gt;
i * deleteCost&amp;amp;;\ j = 0,\ i &amp;gt; 0\\&lt;br /&gt;
j * insertCost&amp;amp;;\ i = 0,\ j &amp;gt; 0\\&lt;br /&gt;
D(i - 1, j - 1)&amp;amp;;\ S[i] = T[j]\\&lt;br /&gt;
\min{(}\\&lt;br /&gt;
\begin{array}{llcl}&lt;br /&gt;
&amp;amp;D(i, j - 1) + insertCost\\&lt;br /&gt;
&amp;amp;D(i - 1, j) + deleteCost&amp;amp;&amp;amp;\\&lt;br /&gt;
&amp;amp;D(i - 1, j - 1) + replaceCost\\&lt;br /&gt;
\end{array}&amp;amp;;\ j &amp;gt; 0,\ i &amp;gt; 0,\ S[i] \ne T[j]\\&lt;br /&gt;
)&lt;br /&gt;
\end{array}\right.&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доказательства требует лишь формула &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;, смысл которой {{---}} сравнение стоимости перехода без использования транспозиции &amp;lt;tex&amp;gt;(A)&amp;lt;/tex&amp;gt; со стоимостью перехода, включающего в число операций транспозицию; остальные формулы обосновываются так же, как и в доказательстве [[Задача о редакционном расстоянии, алгоритм Вагнера-Фишера|алгоритма Вагнера-Фишера]]. Но действительно, при редактировании подпоследовательности несколько раз всегда существует оптимальная последовательность операций одного из двух видов:&lt;br /&gt;
*Переставить местами соседние символы, затем вставить некоторое количество символов между ними;&lt;br /&gt;
*Удалить некоторое количество символов, а затем переставить местами символы, ставшие соседними.&lt;br /&gt;
&lt;br /&gt;
Тогда если символ &amp;lt;tex&amp;gt;S[i]&amp;lt;/tex&amp;gt; встречался в &amp;lt;tex&amp;gt;T[1]..T[j]&amp;lt;/tex&amp;gt; на позиции &amp;lt;tex&amp;gt;j'&amp;lt;/tex&amp;gt;, а символ &amp;lt;tex&amp;gt;T[j]&amp;lt;/tex&amp;gt; встречался в &amp;lt;tex&amp;gt;S[1]..S[i]&amp;lt;/tex&amp;gt; на позиции &amp;lt;tex&amp;gt;i'&amp;lt;/tex&amp;gt;; то &amp;lt;tex&amp;gt;T[1]..T[j]&amp;lt;/tex&amp;gt; может быть получена из &amp;lt;tex&amp;gt;S[1]..S[i]&amp;lt;/tex&amp;gt; удалением символов &amp;lt;tex&amp;gt;S[i' + 1]..S[i - 1]&amp;lt;/tex&amp;gt;, транспозицией ставших соседними &amp;lt;tex&amp;gt;S[i']&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S[i]&amp;lt;/tex&amp;gt; и вставкой символов &amp;lt;tex&amp;gt;T[j' + 1]..T[j - 1]&amp;lt;/tex&amp;gt;. Суммарно на это будет затрачено &amp;lt;tex&amp;gt;D(i', j') + (i - i' - 1) \cdot deleteCost + transposeCost + (j - j' - 1) \cdot insertCost&amp;lt;/tex&amp;gt; операций, что описано в &amp;lt;tex&amp;gt;(*)&amp;lt;/tex&amp;gt;. Поэтому мы выбирали оптимальную последовательность операций, рассмотрев случай с транспозицией и без неё.&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма: &amp;lt;tex&amp;gt;O\left (M \cdot N \cdot \max{(M, N)} \right )&amp;lt;/tex&amp;gt;. Затраты памяти: &amp;lt;tex&amp;gt;O\left (M \cdot N \right)&amp;lt;/tex&amp;gt;. Однако скорость работы алгоритма может быть улучшена до &amp;lt;tex&amp;gt;O\left (M \cdot N \right)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 '''int''' DamerauLevenshteinDistance(S: '''char[1..M]''', T: '''char[1..N]'''; deleteCost, insertCost, replaceCost, transposeCost: '''int'''):&lt;br /&gt;
     ''&amp;lt;font color=green&amp;gt;// Обработка крайних случаев&amp;lt;/font&amp;gt;''&lt;br /&gt;
     '''if''' (S == &amp;quot;&amp;quot;)&lt;br /&gt;
         '''if''' (T == &amp;quot;&amp;quot;)&lt;br /&gt;
             '''return''' 0&lt;br /&gt;
         '''else'''&lt;br /&gt;
             '''return''' N&lt;br /&gt;
     '''else''' '''if''' (T == &amp;quot;&amp;quot;)&lt;br /&gt;
         '''return''' M&lt;br /&gt;
     D: '''int[0..M + 1][0..N + 1]'''   ''&amp;lt;font color=green&amp;gt;// Динамика&amp;lt;/font&amp;gt;''&lt;br /&gt;
     INF = (M + N) * max(deleteCost, insertCost, replaceCost, transposeCost)  ''&amp;lt;font color=green&amp;gt;// Большая константа&amp;lt;/font&amp;gt;''&lt;br /&gt;
     &lt;br /&gt;
     ''&amp;lt;font color=green&amp;gt;// База индукции&amp;lt;/font&amp;gt;''&lt;br /&gt;
     D[0][0] = INF&lt;br /&gt;
     '''for''' i = 0 '''to''' M&lt;br /&gt;
         D[i + 1][1] = i * deleteCost&lt;br /&gt;
         D[i + 1][0] = INF&lt;br /&gt;
     '''for''' j = 0 '''to''' N&lt;br /&gt;
         D[1][j + 1] = j * insertCost&lt;br /&gt;
         D[0][j + 1] = INF&lt;br /&gt;
     &lt;br /&gt;
     lastPosition: '''int[0..количество различных символов в S и T]'''&lt;br /&gt;
     ''&amp;lt;font color=green&amp;gt;//для каждого элемента C алфавита задано значение lastPosition[C]&amp;lt;/font&amp;gt;'' &lt;br /&gt;
     &lt;br /&gt;
     '''foreach''' ('''char''' Letter '''in''' (S + T))&lt;br /&gt;
         lastPosition[Letter] = 0&lt;br /&gt;
     &lt;br /&gt;
     '''for''' i = 1 '''to''' M&lt;br /&gt;
         last = 0&lt;br /&gt;
         '''for''' j = 1 '''to''' N&lt;br /&gt;
             i' = lastPosition[T[j]]&lt;br /&gt;
             j' = last&lt;br /&gt;
             '''if''' S[i] == T[j]&lt;br /&gt;
                 D[i + 1][j + 1] = D[i][j]&lt;br /&gt;
                 last = j&lt;br /&gt;
             '''else'''&lt;br /&gt;
                 D[i + 1][j + 1] = min(D[i][j] + replaceCost, D[i + 1][j] + insertCost, D[i][j + 1] + deleteCost)&lt;br /&gt;
             D[i + 1][j + 1] = min(D[i + 1][j + 1], D[i'][j'] + (i - i' - 1) &amp;lt;tex&amp;gt;\cdot&amp;lt;/tex&amp;gt; deleteCost + transposeCost + (j - j' - 1) &amp;lt;tex&amp;gt;\cdot&amp;lt;/tex&amp;gt; insertCost)&lt;br /&gt;
         lastPosition[S[i]] = i&lt;br /&gt;
      &lt;br /&gt;
     '''return''' D[M][N]&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Задача о наибольшей общей подпоследовательности]]&lt;br /&gt;
*[[Задача о выводе в контекстно-свободной грамматике, алгоритм Кока-Янгера-Касами]]&lt;br /&gt;
*[[Динамическое программирование по профилю]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Damerau–Levenshtein_distance Wikipedia {{---}} Damerau-Levenshtein distance]&lt;br /&gt;
*[http://ru.wikipedia.org/wiki/Расстояние_Дамерау_—_Левенштейна Википедия {{---}} Расстояние Дамерау-Левенштейна] &lt;br /&gt;
*[http://habrahabr.ru/blogs/algorithm/114997/ Хабрахабр {{---}} Нечёткий поиск в тексте и словаре]&lt;br /&gt;
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 3-е изд. — М.: «Вильямс», 2013. — с. 440. — ISBN 978-5-8459-1794-2&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>193.34.232.21</name></author>	</entry>

	</feed>