<?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=94.242.26.14&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=94.242.26.14&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/94.242.26.14"/>
		<updated>2026-05-19T16:38:18Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%BE,_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%80%D0%BD%D1%8B%D0%B9_%D0%B8%D1%81%D1%85%D0%BE%D0%B4,_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D0%B5&amp;diff=60861</id>
		<title>Вероятностное пространство, элементарный исход, событие</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%BE,_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%80%D0%BD%D1%8B%D0%B9_%D0%B8%D1%81%D1%85%D0%BE%D0%B4,_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D0%B5&amp;diff=60861"/>
				<updated>2017-05-21T00:17:40Z</updated>
		
		<summary type="html">&lt;p&gt;94.242.26.14: /* Примеры вероятностных пространств */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Основные определения==&lt;br /&gt;
{{Определение | definition =&lt;br /&gt;
'''Дискретным вероятностным пространством''' (англ. ''discrete probability space'') называется пара из некоторого (не более, чем счетного) множества &amp;lt;tex&amp;gt;\Omega&amp;lt;/tex&amp;gt; и функции &amp;lt;tex&amp;gt;p\colon \Omega \to \mathbb R_+ &amp;lt;/tex&amp;gt;  ( &amp;lt;tex&amp;gt;\Omega&amp;lt;/tex&amp;gt; называется '''множеством элементарных исходов''' (англ. ''sample space''), &amp;lt;tex&amp;gt;\omega \in \Omega&amp;lt;/tex&amp;gt; {{---}} '''элементарным исходом''' (англ. ''elementary outcome''), такая, что &amp;lt;tex&amp;gt;\sum_{\omega \in \Omega}\limits {p(\omega)} = 1&amp;lt;/tex&amp;gt;.  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; называют '''дискретной вероятностной мерой''' (англ. ''discrete probability measure''), или '''дискретной плотностью вероятности''' (англ. ''discrete probability density'').&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p(\omega)&amp;lt;/tex&amp;gt; {{---}} вероятность элементарного исхода. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Определение | definition =&lt;br /&gt;
Множество &amp;lt;tex&amp;gt;A \subset \Omega&amp;lt;/tex&amp;gt; называется '''событием''' (англ. ''event''). &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p(A)= \sum_{a \in A}\limits {p(a)}&amp;lt;/tex&amp;gt;, то есть вероятность события равна сумме вероятностей входящих в него элементарных исходов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Определение | definition = '''Прямым произведением вероятностных пространств''' (англ. ''direct product of probability spaces'') &amp;lt;tex&amp;gt;X=\langle\Omega_{1},p{}_{1}\rangle&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y=\langle\Omega_{2},p{}_{2}\rangle&amp;lt;/tex&amp;gt; называется такое вероятностное пространство &amp;lt;tex&amp;gt;Z\:\langle\Omega,p\rangle \: = X\times Y&amp;lt;/tex&amp;gt;, что&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\Omega=\Omega_{1}\times\Omega_{2}&amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tex&amp;gt; p(\omega_{1},\omega_{2}) = p(\omega_{1})\cdot p(\omega_{2})&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Другими словами, &amp;lt;tex&amp;gt;\Omega&amp;lt;/tex&amp;gt; {{---}} множество всех пар элементарных исходов из &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Y&amp;lt;/tex&amp;gt; (т.е. декартово произведение этих множеств).&lt;br /&gt;
&lt;br /&gt;
==Примеры вероятностных пространств==&lt;br /&gt;
# '''Конечные вероятностные пространства'''&lt;br /&gt;
## '''Честная монета''' &amp;lt;br /&amp;gt; Множество исходов &amp;lt;tex&amp;gt;\Omega = \left\{0,1\right\}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; {{---}} выпадает орел, &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; {{---}} выпадает решка. &amp;lt;tex&amp;gt; p(0)=p(1)=0,5.&amp;lt;/tex&amp;gt;. &amp;lt;br /&amp;gt; Рассмотрим все возможные события и их вероятности для этого пространства. &amp;lt;br/&amp;gt; &amp;lt;tex&amp;gt;\varnothing &amp;lt;/tex&amp;gt;:                &amp;lt;tex&amp;gt;  p(\varnothing)=0&amp;lt;/tex&amp;gt;. То есть вероятность того, что не выпадет ничего, равна нулю. &amp;lt;br/&amp;gt; &amp;lt;tex&amp;gt;\left\{0\right\} &amp;lt;/tex&amp;gt;:           &amp;lt;tex&amp;gt;  p(0)=0,5&amp;lt;/tex&amp;gt;. Вероятность того, что выпадет орел, равна одной второй. &amp;lt;br/&amp;gt; &amp;lt;tex&amp;gt;\left\{1\right\} &amp;lt;/tex&amp;gt;:           &amp;lt;tex&amp;gt;  p(1)=0,5&amp;lt;/tex&amp;gt;. Вероятность того, что выпадет решка, равна одной второй.&amp;lt;br/&amp;gt; &amp;lt;tex&amp;gt;\left\{0,1\right\} &amp;lt;/tex&amp;gt;:         &amp;lt;tex&amp;gt;  p(\left\{0,1\right\})=1&amp;lt;/tex&amp;gt;. Действительно, вероятность того, что выпадет орел или решка, равна единице.&lt;br /&gt;
## '''Нечестная монета''' &amp;lt;br/&amp;gt; Множество исходов здесь такое же, как и в предыдущем пространстве, однако &amp;lt;tex&amp;gt;p(0)=x, p(1) = 1 - x=y&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;x,y \in \left[ 0,1 \right ]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
## '''Игральная кость''' &amp;lt;br/&amp;gt; Множество исходов &amp;lt;tex&amp;gt;\Omega = \left\{1,2,3,4,5,6\right\}&amp;lt;/tex&amp;gt;.   &amp;lt;tex&amp;gt; p(i)= \dfrac {1}{6}&amp;lt;/tex&amp;gt;. Рассмотрим некоторые события этого пространства. &amp;lt;br/&amp;gt; &amp;lt;tex&amp;gt;A=\left\{1,2,3 \right\}&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;p(A)=\dfrac {1}{6}+\dfrac{1}{6}+\dfrac{1}{6}=\dfrac{3}{6}=\dfrac{1}{2}&amp;lt;/tex&amp;gt;. Вероятность выпадения одного из трех чисел {{---}} &amp;lt;tex&amp;gt;1, 2, 3&amp;lt;/tex&amp;gt; {{---}} равна одной второй. &amp;lt;br/&amp;gt; &amp;lt;tex&amp;gt;B=\left\{2,4 \right\}&amp;lt;/tex&amp;gt; : &amp;lt;tex&amp;gt;p(B)=\dfrac {1}{6}+\dfrac{1}{6}=\dfrac{2}{6}=\dfrac{1}{3}&amp;lt;/tex&amp;gt;. Числа &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; выпадут с вероятностью одна треть.&lt;br /&gt;
## '''Колода карт''' &amp;lt;br/&amp;gt; &amp;lt;tex&amp;gt;\Omega = \left\{\left \langle i,j\right \rangle| i \in \left\{1..4\right\}; j \in \left\{1..13\right\}    \right\}&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; {{---}} достоинство карты. &amp;lt;br/&amp;gt; Вероятность элементарного исхода этого пространства &amp;lt;tex&amp;gt;p(\left \langle i,j\right \rangle)=\dfrac {1}{52}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# '''Бесконечное вероятностное пространство''' &amp;lt;br/&amp;gt; Пусть задано множество следующих элементарных исходов: выпадение орла на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ом подбрасывании честной монеты в первый раз. &amp;lt;br/&amp;gt; Тогда вероятность исхода с номером &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; равна: &amp;lt;tex&amp;gt; p(A_{i}) = \dfrac {1}{2^{i} } &amp;lt;/tex&amp;gt;.  &amp;lt;br/&amp;gt; Очевидно, что вероятности этих событий образовывают убывающую геометрическую прогрессию с знаменателем прогрессии равным  &amp;lt;tex&amp;gt; \dfrac {1}{2} &amp;lt;/tex&amp;gt;. Найдем сумму этой прогрессии: &amp;lt;tex&amp;gt; \sum \limits_{i=1}^{\infty} p(A_{i}) = \dfrac { b_{1} } { 1 - q } = \dfrac { \dfrac{1}{2} }{ 1 -\dfrac{1}{2} } = 1&amp;lt;/tex&amp;gt;. &amp;lt;br/&amp;gt; Так как сумма всех элементарных исходов равна &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, то это множество является вероятностым пространством.&lt;br /&gt;
&lt;br /&gt;
==См. так же==&lt;br /&gt;
1.[http://ru.wikipedia.org/wiki/Вероятностное_пространство Вероятностное пространство]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
2.[http://www.machinelearning.ru/wiki/index.php?title=%D0%92%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%BE Дискретное вероятностное пространство]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
1. ''Ширяев А.Н.'' Вероятность. — М.: МЦНМО, 2004.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория вероятности ]]&lt;/div&gt;</summary>
		<author><name>94.242.26.14</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0_%D1%87%D0%B5%D1%82%D1%8B%D1%80%D1%91%D1%85_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D1%85_%D0%B2_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%D1%85_%D0%94%D0%9F_%D0%BD%D0%B0_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BE_%D0%9D%D0%9E%D0%9F&amp;diff=59190</id>
		<title>Применение метода четырёх русских в задачах ДП на примере задачи о НОП</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0_%D1%87%D0%B5%D1%82%D1%8B%D1%80%D1%91%D1%85_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D1%85_%D0%B2_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%D1%85_%D0%94%D0%9F_%D0%BD%D0%B0_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BE_%D0%9D%D0%9E%D0%9F&amp;diff=59190"/>
				<updated>2017-01-07T20:07:10Z</updated>
		
		<summary type="html">&lt;p&gt;94.242.26.14: /* Предподсчёт */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Предподсчёт ===&lt;br /&gt;
Рассмотрим [[Задача о наибольшей общей подпоследовательности|задачу о наибольшей общей подпоследовательности]] для двух последовательностей одинаковой длины. Тогда таблица динамического программирования имеет размер &amp;lt;tex&amp;gt; (n + 1) \times (n + 1) &amp;lt;/tex&amp;gt;. Разобьём её на квадраты размера &amp;lt;tex&amp;gt; k \times k &amp;lt;/tex&amp;gt; следующим образом: выделим каждую &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;-ую строчку, начиная с первой. Аналогично выделяем столбцы.&lt;br /&gt;
&lt;br /&gt;
Требуется, чтобы &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; делило &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;, но это не является ограничением {{---}} можно дописать в конец последовательностей символы, которые не встречались в других местах этих последовательностей (символы для каждой последовательности должны быть разными). Тогда ответ на задачу не изменится, а длину можно «довести» до делителя &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сделаем предподсчёт действия каждого возможного квадрата. Окончательный результат зависит только от значений в верхнем левом «уголке» над квадратом и подстрок, для которых считается ответ {{---}} остальные значения в квадрате однозначно считаются с их помощью. Окончательным результатом будут значения в нижнем правом «уголке» квадрата.&lt;br /&gt;
&lt;br /&gt;
Может показаться, что таких уголков может быть много. Но, так как соседние числа в матрице отличаются не более, чем на один, то результат зависит только от константы в верхнем левом элементе матрицы, и возрастания чисел в верхнем и левом крае квадрата. Возрастание чисел будем хранить с помощью битовых масок: сначала &amp;lt;tex&amp;gt; k - 1 &amp;lt;/tex&amp;gt; бит кодирует возрастание чисел в верхнем крае квадрата (0 {{---}} элемент равен предыдущему, 1 {{---}} больше предыдущего на один), потом &amp;lt;tex&amp;gt; k - 1 &amp;lt;/tex&amp;gt; бит кодируют возрастание чисел в квадрате по левому краю аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
Более того, константу в верхнем левом элементе квадрата можно вообще не хранить: её можно прибавить при необходимости к каждому элементу результата.&lt;br /&gt;
&lt;br /&gt;
Посчитаем эти квадраты для строк abbabb и bababb. Возьмём &amp;lt;tex&amp;gt; k = 3 &amp;lt;/tex&amp;gt;. Тогда предподсчитанные квадраты, которые понадобятся для дальнейшего вычисления НОП, выглядят так:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#FFF; text-align:center; &amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;&lt;br /&gt;
|&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#FFF; text-align:center; &amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#FFF; text-align:center; &amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;&lt;br /&gt;
|&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#FFF; text-align:center; &amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Вычисление НОП на сжатой матрице ===&lt;br /&gt;
Ответ для самой задачи НОП считается аналогично обычному алгоритму, только рассматривая не каждую ячейку таблицы, а квадраты &amp;lt;tex&amp;gt; k \times k &amp;lt;/tex&amp;gt;. В очередной квадрат (пусть его левый верхний угол находится в ячейке с координатами &amp;lt;tex&amp;gt; i, j &amp;lt;/tex&amp;gt;) вставляем значения предподсчитанного квадрата, соответствующего данным подстрокам и битовым маскам, и прибавляем ко всем элементам в квадрате число, стоящее в уголке над квадратом, т.е. в ячейке с координатами &amp;lt;tex&amp;gt; i - 1, j - 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нашего примера итоговая таблица выглядит так:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot; border-collapse:collapse; text-align: center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 0 0 1px&amp;quot;|&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 0 0 0&amp;quot;|&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 0 0 0 1px&amp;quot;|&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px;border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Анализ алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Время работы ===&lt;br /&gt;
При предподсчёте перебирается &amp;lt;tex&amp;gt; | \Sigma | ^k &amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt; | \Sigma | &amp;lt;/tex&amp;gt; {{---}} мощность алфавита) возможных подстрок первой строки и столько же {{---}} второй строки. Для каждой возможной подстроки обеих строк перебирается по &amp;lt;tex&amp;gt; 2^{k - 1} &amp;lt;/tex&amp;gt; битовых масок. Для самого предподсчёта требуется время &amp;lt;tex&amp;gt; O(k^2) &amp;lt;/tex&amp;gt;. Дальнейший алгоритм поиска НОП требует &amp;lt;tex&amp;gt; O \left ( \frac{n^2}{k^2} \right ) &amp;lt;/tex&amp;gt;. Тогда суммарное время работы алгоритма составляет &amp;lt;tex&amp;gt; O \left ( |\Sigma| ^{2k} \cdot 2^{2k - 2} \cdot k^2 + \frac{n^2}{k^2} \right ) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Понятно, что для получения выигрыша в производительности по сравнению с обычным алгоритмом необходимо, чтобы первое слагаемое не превышало второе. Найдём &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, решив неравенство:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; |\Sigma| ^{2k} \cdot 2^{2k - 2} \cdot k^2 \leqslant \frac{n^2}{k^2} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \left ( 2 | \Sigma | \right ) ^{2k} \cdot \frac{1}{4} \cdot k^4 \leqslant n^2 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \left ( 2 | \Sigma | \right ) ^k \cdot k^2 \leqslant 2n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; k \log {2 | \Sigma |} + 2 \log k \leqslant \log 2 + \log n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пренебрегая &amp;lt;tex&amp;gt; \log k &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \log 2 &amp;lt;/tex&amp;gt; как &amp;lt;tex&amp;gt; o(k) &amp;lt;/tex&amp;gt;, получаем &amp;lt;tex&amp;gt; k \leqslant \frac{\log n}{1 + \log | \Sigma |}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Используемая память ===&lt;br /&gt;
Для каждого предподсчитанного квадрата хранятся подстроки длиной &amp;lt;tex&amp;gt; 2k &amp;lt;/tex&amp;gt;, битовые маски длиной &amp;lt;tex&amp;gt; 2k &amp;lt;/tex&amp;gt; и результат {{---}} нижний «уголок» длины &amp;lt;tex&amp;gt; 2k - 1 &amp;lt;/tex&amp;gt;. Как уже было подсчитано, всего предподсчитывается &amp;lt;tex&amp;gt; |\Sigma| ^{2k} \cdot 2^{2k - 2} &amp;lt;/tex&amp;gt; квадратов. Дальнейший алгоритм требует &amp;lt;tex&amp;gt; O \left ( \frac{n^2}{k^2} \right ) &amp;lt;/tex&amp;gt;, значит, всего требуется &amp;lt;tex&amp;gt; O \left ( |\Sigma| ^{2k} \cdot 2^{2k - 2} \cdot (2k + 2k + 2k - 1) + \frac{n^2}{k^2} \right ) = O \left ( |\Sigma| ^{2k} \cdot 2^{2k - 2} \cdot k + \frac{n^2}{k^2} \right ) &amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* http://pages.cpsc.ucalgary.ca/~pmohasse/private-lcs.pdf&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Динамическое программирование]]&lt;br /&gt;
[[Категория:Способы оптимизации методов динамического программирования]]&lt;/div&gt;</summary>
		<author><name>94.242.26.14</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0_%D1%87%D0%B5%D1%82%D1%8B%D1%80%D1%91%D1%85_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D1%85_%D0%B2_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%D1%85_%D0%94%D0%9F_%D0%BD%D0%B0_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BE_%D0%9D%D0%9E%D0%9F&amp;diff=59189</id>
		<title>Применение метода четырёх русских в задачах ДП на примере задачи о НОП</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0_%D1%87%D0%B5%D1%82%D1%8B%D1%80%D1%91%D1%85_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D1%85_%D0%B2_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%D1%85_%D0%94%D0%9F_%D0%BD%D0%B0_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B5_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8_%D0%BE_%D0%9D%D0%9E%D0%9F&amp;diff=59189"/>
				<updated>2017-01-07T20:05:05Z</updated>
		
		<summary type="html">&lt;p&gt;94.242.26.14: /* Вычисление НОП на сжатой матрице */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Предподсчёт ===&lt;br /&gt;
Рассмотрим [[Задача о наибольшей общей подпоследовательности|задачу о наибольшей общей подпоследовательности]] для двух последовательностей одинаковой длины. Тогда таблица динамического программирования имеет размер &amp;lt;tex&amp;gt; (n + 1) \times (n + 1) &amp;lt;/tex&amp;gt;. Разобьём её на квадраты размера &amp;lt;tex&amp;gt; k \times k &amp;lt;/tex&amp;gt; следующим образом: выделим каждую &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;-ую строчку, начиная с первой. Аналогично выделяем столбцы.&lt;br /&gt;
&lt;br /&gt;
Требуется, чтобы &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; делило &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;, но это не является ограничением {{---}} можно дописать в конец последовательностей символы, которые не встречались в других местах этих последовательностей (символы для каждой последовательности должны быть разными). Тогда ответ на задачу не изменится, а длину можно «довести» до делителя &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сделаем предподсчёт действия каждого возможного квадрата. Окончательный результат зависит только от значений в верхнем левом «уголке» над квадратом и подстрок, для которых считается ответ {{---}} остальные значения в квадрате однозначно считаются с их помощью. Окончательным результатом будут значения в нижнем правом «уголке» квадрата.&lt;br /&gt;
&lt;br /&gt;
Может показаться, что таких уголков может быть много. Но, так как соседние числа в матрице отличаются не более, чем на один, то результат зависит только от константы в верхнем левом элементе матрицы, и возрастания чисел в верхнем и левом крае квадрата. Возрастание чисел будем хранить с помощью битовых масок: сначала &amp;lt;tex&amp;gt; k - 1 &amp;lt;/tex&amp;gt; бит кодирует возрастание чисел в верхнем крае квадрата (0 {{---}} элемент равен предыдущему, 1 {{---}} больше предыдущего на один), потом &amp;lt;tex&amp;gt; k - 1 &amp;lt;/tex&amp;gt; бит кодируют возрастание чисел в квадрате по левому краю аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
Более того, константу в верхнем левом элементе квадрата можно вообще не хранить: её можно прибавить при необходимости к каждому элементу результата.&lt;br /&gt;
&lt;br /&gt;
Посчитаем эти квадраты для строк abbabb и bababb. Возьмём &amp;lt;tex&amp;gt; k = 3 &amp;lt;/tex&amp;gt;. Тогда предподсчитанные квадраты, которые понадобятся для дальнейшего вычисления НОП, выглядят так:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#FFF; text-align:center; &amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;&lt;br /&gt;
|&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#FFF; text-align:center; &amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#FFF; text-align:center; &amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;||&amp;amp;nbsp;&lt;br /&gt;
|&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#FFF; text-align:center; &amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;background-color:#E0FFFF; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
! style=&amp;quot;background-color:#FFEECC; width: 40px; height: 40px;&amp;quot; |&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Вычисление НОП на сжатой матрице ===&lt;br /&gt;
Ответ для самой задачи НОП считается аналогично обычному алгоритму, только рассматривая не каждую ячейку таблицы, а квадраты &amp;lt;tex&amp;gt; k \times k &amp;lt;/tex&amp;gt;. В очередной квадрат (пусть его левый верхний угол находится в ячейке с координатами &amp;lt;tex&amp;gt; i, j &amp;lt;/tex&amp;gt;) вставляем значения предподсчитанного квадрата, соответствующего данным подстрокам и битовым маскам, и прибавляем ко всем элементам в квадрате число, стоящее в уголке над квадратом, т.е. в ячейке с координатами &amp;lt;tex&amp;gt; i - 1, j - 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нашего примера итоговая таблица выглядит так:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot; border-collapse:collapse; text-align: center&amp;quot;&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 0 0 1px&amp;quot;|&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 0 0 0&amp;quot;|&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 0 0 0 1px&amp;quot;|&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px;border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #FFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color: #FFEECC; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot;|&amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color: #E0FFFF; width: 40px; height: 40px; border-color: #aaa; border-style: solid; border-width: 1px 1px 1px 1px&amp;quot; |&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Анализ алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Время работы ===&lt;br /&gt;
При предподсчёте перебирается &amp;lt;tex&amp;gt; | \Sigma | ^k &amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt; | \Sigma | &amp;lt;/tex&amp;gt; {{---}} мощность алфавита) возможных подстрок первой строки и столько же {{---}} второй строки. Для каждой возможной подстроки обеих строк перебирается по &amp;lt;tex&amp;gt; 2^{k - 1} &amp;lt;/tex&amp;gt; битовых масок. Для самого предподсчёта требуется время &amp;lt;tex&amp;gt; O(k^2) &amp;lt;/tex&amp;gt;. Дальнейший алгоритм поиска НОП требует &amp;lt;tex&amp;gt; O \left ( \frac{n^2}{k^2} \right ) &amp;lt;/tex&amp;gt;. Тогда суммарное время работы алгоритма составляет &amp;lt;tex&amp;gt; O \left ( |\Sigma| ^{2k} \cdot 2^{2k - 2} \cdot k^2 + \frac{n^2}{k^2} \right ) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Понятно, что для получения выигрыша в производительности по сравнению с обычным алгоритмом необходимо, чтобы первое слагаемое не превышало второе. Найдём &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, решив неравенство:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; |\Sigma| ^{2k} \cdot 2^{2k - 2} \cdot k^2 \leqslant \frac{n^2}{k^2} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \left ( 2 | \Sigma | \right ) ^{2k} \cdot \frac{1}{4} \cdot k^4 \leqslant n^2 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \left ( 2 | \Sigma | \right ) ^k \cdot k^2 \leqslant 2n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; k \log {2 | \Sigma |} + 2 \log k \leqslant \log 2 + \log n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пренебрегая &amp;lt;tex&amp;gt; \log k &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \log 2 &amp;lt;/tex&amp;gt; как &amp;lt;tex&amp;gt; o(k) &amp;lt;/tex&amp;gt;, получаем &amp;lt;tex&amp;gt; k \leqslant \frac{\log n}{1 + \log | \Sigma |}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Используемая память ===&lt;br /&gt;
Для каждого предподсчитанного квадрата хранятся подстроки длиной &amp;lt;tex&amp;gt; 2k &amp;lt;/tex&amp;gt;, битовые маски длиной &amp;lt;tex&amp;gt; 2k &amp;lt;/tex&amp;gt; и результат {{---}} нижний «уголок» длины &amp;lt;tex&amp;gt; 2k - 1 &amp;lt;/tex&amp;gt;. Как уже было подсчитано, всего предподсчитывается &amp;lt;tex&amp;gt; |\Sigma| ^{2k} \cdot 2^{2k - 2} &amp;lt;/tex&amp;gt; квадратов. Дальнейший алгоритм требует &amp;lt;tex&amp;gt; O \left ( \frac{n^2}{k^2} \right ) &amp;lt;/tex&amp;gt;, значит, всего требуется &amp;lt;tex&amp;gt; O \left ( |\Sigma| ^{2k} \cdot 2^{2k - 2} \cdot (2k + 2k + 2k - 1) + \frac{n^2}{k^2} \right ) = O \left ( |\Sigma| ^{2k} \cdot 2^{2k - 2} \cdot k + \frac{n^2}{k^2} \right ) &amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* http://pages.cpsc.ucalgary.ca/~pmohasse/private-lcs.pdf&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Динамическое программирование]]&lt;br /&gt;
[[Категория:Способы оптимизации методов динамического программирования]]&lt;/div&gt;</summary>
		<author><name>94.242.26.14</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D1%80%D0%B0%D0%BD%D0%B7%D0%B8%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D0%BE%D1%81%D1%82%D0%BE%D0%B2&amp;diff=59014</id>
		<title>Транзитивный остов</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D1%80%D0%B0%D0%BD%D0%B7%D0%B8%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D0%BE%D1%81%D1%82%D0%BE%D0%B2&amp;diff=59014"/>
				<updated>2017-01-06T23:46:45Z</updated>
		
		<summary type="html">&lt;p&gt;94.242.26.14: /* Источники информации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Транзитивным остовом''' (''transitive reduction'') [[Определение отношения|отношения]] &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt; на множестве &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; называется минимальное отношение &amp;lt;tex&amp;gt; R^- &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; такое, что [[транзитивное замыкание]] &amp;lt;tex&amp;gt; R^- &amp;lt;/tex&amp;gt; равно транзитивному замыканию &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
== Алгоритм для антисимметричных отношений ==&lt;br /&gt;
Для удобства представим отношение в виде графа: &amp;lt;tex&amp;gt; G = \left &amp;lt; V, E \right &amp;gt; &amp;lt;/tex&amp;gt;. Его транзитивным остовом будет граф &amp;lt;tex&amp;gt; G^- = \left &amp;lt; V, E^- \right &amp;gt; &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Введём несколько обозначений:&lt;br /&gt;
* &amp;lt;tex&amp;gt; u \underset{G}{\to} v &amp;lt;/tex&amp;gt; — в графе &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; есть ребро из вершины &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt; u \underset{G}{\leadsto} v &amp;lt;/tex&amp;gt; — в графе &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; есть путь (возможно, рёберно пустой) из вершины &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt; u \underset{G}{\overset{+}{\leadsto}} v &amp;lt;/tex&amp;gt; — в графе &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; есть рёберно непустой путь из вершины &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также введём определение транзитивного замыкания в терминах теории графов: &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Транзитивным замыканием''' графа &amp;lt;tex&amp;gt; G = \left &amp;lt; V, E \right &amp;gt; &amp;lt;/tex&amp;gt; называется граф &amp;lt;tex&amp;gt; G^* = \left &amp;lt; V, E^* \right &amp;gt; &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; E^* = \left \{ (i, j) \in V \times V | i \underset{G}{\leadsto} j \right \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
 &lt;br /&gt;
Так как отношение антисимметрично, то граф ацикличен, то есть в нём выполняется следующее: &amp;lt;tex&amp;gt; \forall i, j \in V: i \underset{G}{\overset{+}{\leadsto}} j \Longrightarrow i \neq j &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Докажем теорему, из которой следует алгоритм.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; G^- = \left &amp;lt; V, E^- \right &amp;gt; &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt; E^- = \left \{ k \underset{G}{\to} m \ | \  \forall l: [ k \underset{G}{\leadsto} l \wedge l \underset{G}{\to} m \Longrightarrow k = l ] \right \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем, что &amp;lt;tex&amp;gt; E^- \subseteq \left \{ k \underset{G}{\to} m \ | \  \forall l: [ k \underset{G}{\leadsto} l \wedge l \underset{G}{\to} m \Longrightarrow k = l ] \right \}&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; G^- &amp;lt;/tex&amp;gt; уже построен. Пусть &amp;lt;tex&amp;gt; k \underset{G^-}{\to} m &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt; k \neq m &amp;lt;/tex&amp;gt; (так как иначе удаление ребра &amp;lt;tex&amp;gt; (k, m) &amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt; E^- &amp;lt;/tex&amp;gt; приведёт к образованию меньшего графа с тем же транзитивным замыканием, что нарушает условие минимальности транзитивного остова). Поэтому по определению транзитивного остова &amp;lt;tex&amp;gt; k \underset{G}{\overset{+}{\leadsto}} m &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; — вершина, для которой выполняется &amp;lt;tex&amp;gt; k \underset{G}{\leadsto} l \wedge l \underset{G}{\to} m &amp;lt;/tex&amp;gt;. Докажем, что &amp;lt;tex&amp;gt; k = l &amp;lt;/tex&amp;gt;, от противного. Пусть &amp;lt;tex&amp;gt; k \neq l &amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; ацикличен, поэтому &amp;lt;tex&amp;gt; l \neq m &amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt; G^* = (G^-)^* &amp;lt;/tex&amp;gt;, верно &amp;lt;tex&amp;gt; k \underset{G^-}{\overset{+}{\leadsto}} l \wedge l \underset{G^-}{\overset{+}{\leadsto}} m &amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt; G^- &amp;lt;/tex&amp;gt; ацикличен, путь из &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; не может содержать ребра &amp;lt;tex&amp;gt; (k, m) &amp;lt;/tex&amp;gt;, аналогично путь из &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; не может содержать &amp;lt;tex&amp;gt; (k, m) &amp;lt;/tex&amp;gt;. Поэтому в &amp;lt;tex&amp;gt; G^- &amp;lt;/tex&amp;gt; существует путь из &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt;, не содержащий в себе ребро &amp;lt;tex&amp;gt; (k, m) &amp;lt;/tex&amp;gt;, значит, удаление &amp;lt;tex&amp;gt; (k, m) &amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt; E^- &amp;lt;/tex&amp;gt; не изменит транзитивное замыкание, что противоречит условию минимальности &amp;lt;tex&amp;gt; E^- &amp;lt;/tex&amp;gt;. Поэтому &amp;lt;tex&amp;gt; \forall l: [ k \underset{G}{\leadsto} l \wedge l \underset{G}{\to} m \Longrightarrow k = l ] &amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt; k \underset{G}{\overset{+}{\leadsto}} m &amp;lt;/tex&amp;gt;, существует такая вершина &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt; k \underset{G}{\leadsto} l \wedge l \underset{G}{\to} m &amp;lt;/tex&amp;gt;, что приводит к выводу, что &amp;lt;tex&amp;gt; k \underset{G}{\to} m &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Докажем, что &amp;lt;tex&amp;gt; \left \{  k \underset{G}{\to} m \ | \  \forall l: [ k \underset{G}{\leadsto} l \wedge l \underset{G}{\to} m \Longrightarrow k = l ] \right \} \subseteq  E^- &amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Предположим, что &amp;lt;tex&amp;gt; k \underset{G}{\to} m &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \forall l: [ k \underset{G}{\leadsto} l \wedge l \underset{G}{\to} m \Longrightarrow k = l ] &amp;lt;/tex&amp;gt;. Докажем, что &amp;lt;tex&amp;gt; k G^- m &amp;lt;/tex&amp;gt;, от противного. Предположим, что &amp;lt;tex&amp;gt; (k, m) \notin E^- &amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; ацикличен, &amp;lt;tex&amp;gt; k \neq m &amp;lt;/tex&amp;gt; и поэтому &amp;lt;tex&amp;gt; k \underset{G^-}{\overset{+}{\leadsto}} m &amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt; (k, m) \notin E^- &amp;lt;/tex&amp;gt;, существует вершина &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; такая, что &amp;lt;tex&amp;gt; k \underset{G^-}{\leadsto} l \wedge l \underset{G^-}{\leadsto} m &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; k \neq l \neq m &amp;lt;/tex&amp;gt;, поэтому &amp;lt;tex&amp;gt; k \underset{G}{\overset{+}{\leadsto}} l \wedge l \underset{G}{\overset{+}{\leadsto}} m &amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; ацикличен, существует вершина &amp;lt;tex&amp;gt; l' \neq k &amp;lt;/tex&amp;gt;, для которой выполняется &amp;lt;tex&amp;gt; k \underset{G}{\overset{+}{\leadsto}} l' \wedge l' \underset{G}{\to} m &amp;lt;/tex&amp;gt;, что противоречит нашему предположению.&lt;br /&gt;
&lt;br /&gt;
Так как множества &amp;lt;tex&amp;gt; E^- &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \left \{  k \underset{G}{\to} m \ | \  \forall l: [ k \underset{G}{\leadsto} l \wedge l \underset{G}{\to} m \Longrightarrow k = l ] \right \} &amp;lt;/tex&amp;gt; включены друг в друга, они совпадают, что и требовалось доказать.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Псевдокод ===&lt;br /&gt;
  &amp;lt;tex&amp;gt; R^- &amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;&lt;br /&gt;
  foreach &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt; in &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt;&lt;br /&gt;
    foreach &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt; in &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt;&lt;br /&gt;
      foreach &amp;lt;tex&amp;gt; c &amp;lt;/tex&amp;gt; in &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt;&lt;br /&gt;
        if &amp;lt;tex&amp;gt; aRb &amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt; bRc &amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt; aRc &amp;lt;/tex&amp;gt;&lt;br /&gt;
          &amp;lt;tex&amp;gt; R^- &amp;lt;/tex&amp;gt;.delete(pair(&amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; c &amp;lt;/tex&amp;gt;))&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Transitive_reduction Wikipedia: Transitive reduction]&lt;br /&gt;
* [http://archive.cs.uu.nl/pub/RUU/CS/techreps/CS-1987/1987-25.pdf J.A. La Poutré and J. van Leeuwen. «Maintenance of transitive closures and transitive reductions of graphs», 1987]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Отношения ]]&lt;/div&gt;</summary>
		<author><name>94.242.26.14</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D1%80%D0%B0%D0%BD%D0%B7%D0%B8%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D0%BE%D1%81%D1%82%D0%BE%D0%B2&amp;diff=59013</id>
		<title>Транзитивный остов</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D1%80%D0%B0%D0%BD%D0%B7%D0%B8%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D0%BE%D1%81%D1%82%D0%BE%D0%B2&amp;diff=59013"/>
				<updated>2017-01-06T23:38:50Z</updated>
		
		<summary type="html">&lt;p&gt;94.242.26.14: /* Источники */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Транзитивным остовом''' (''transitive reduction'') [[Определение отношения|отношения]] &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt; на множестве &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; называется минимальное отношение &amp;lt;tex&amp;gt; R^- &amp;lt;/tex&amp;gt; на &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; такое, что [[транзитивное замыкание]] &amp;lt;tex&amp;gt; R^- &amp;lt;/tex&amp;gt; равно транзитивному замыканию &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
== Алгоритм для антисимметричных отношений ==&lt;br /&gt;
Для удобства представим отношение в виде графа: &amp;lt;tex&amp;gt; G = \left &amp;lt; V, E \right &amp;gt; &amp;lt;/tex&amp;gt;. Его транзитивным остовом будет граф &amp;lt;tex&amp;gt; G^- = \left &amp;lt; V, E^- \right &amp;gt; &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Введём несколько обозначений:&lt;br /&gt;
* &amp;lt;tex&amp;gt; u \underset{G}{\to} v &amp;lt;/tex&amp;gt; — в графе &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; есть ребро из вершины &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt; u \underset{G}{\leadsto} v &amp;lt;/tex&amp;gt; — в графе &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; есть путь (возможно, рёберно пустой) из вершины &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt; u \underset{G}{\overset{+}{\leadsto}} v &amp;lt;/tex&amp;gt; — в графе &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; есть рёберно непустой путь из вершины &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также введём определение транзитивного замыкания в терминах теории графов: &lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Транзитивным замыканием''' графа &amp;lt;tex&amp;gt; G = \left &amp;lt; V, E \right &amp;gt; &amp;lt;/tex&amp;gt; называется граф &amp;lt;tex&amp;gt; G^* = \left &amp;lt; V, E^* \right &amp;gt; &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; E^* = \left \{ (i, j) \in V \times V | i \underset{G}{\leadsto} j \right \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
 &lt;br /&gt;
Так как отношение антисимметрично, то граф ацикличен, то есть в нём выполняется следующее: &amp;lt;tex&amp;gt; \forall i, j \in V: i \underset{G}{\overset{+}{\leadsto}} j \Longrightarrow i \neq j &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Докажем теорему, из которой следует алгоритм.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; G^- = \left &amp;lt; V, E^- \right &amp;gt; &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt; E^- = \left \{ k \underset{G}{\to} m \ | \  \forall l: [ k \underset{G}{\leadsto} l \wedge l \underset{G}{\to} m \Longrightarrow k = l ] \right \} &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем, что &amp;lt;tex&amp;gt; E^- \subseteq \left \{ k \underset{G}{\to} m \ | \  \forall l: [ k \underset{G}{\leadsto} l \wedge l \underset{G}{\to} m \Longrightarrow k = l ] \right \}&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; G^- &amp;lt;/tex&amp;gt; уже построен. Пусть &amp;lt;tex&amp;gt; k \underset{G^-}{\to} m &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt; k \neq m &amp;lt;/tex&amp;gt; (так как иначе удаление ребра &amp;lt;tex&amp;gt; (k, m) &amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt; E^- &amp;lt;/tex&amp;gt; приведёт к образованию меньшего графа с тем же транзитивным замыканием, что нарушает условие минимальности транзитивного остова). Поэтому по определению транзитивного остова &amp;lt;tex&amp;gt; k \underset{G}{\overset{+}{\leadsto}} m &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; — вершина, для которой выполняется &amp;lt;tex&amp;gt; k \underset{G}{\leadsto} l \wedge l \underset{G}{\to} m &amp;lt;/tex&amp;gt;. Докажем, что &amp;lt;tex&amp;gt; k = l &amp;lt;/tex&amp;gt;, от противного. Пусть &amp;lt;tex&amp;gt; k \neq l &amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; ацикличен, поэтому &amp;lt;tex&amp;gt; l \neq m &amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt; G^* = (G^-)^* &amp;lt;/tex&amp;gt;, верно &amp;lt;tex&amp;gt; k \underset{G^-}{\overset{+}{\leadsto}} l \wedge l \underset{G^-}{\overset{+}{\leadsto}} m &amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt; G^- &amp;lt;/tex&amp;gt; ацикличен, путь из &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; не может содержать ребра &amp;lt;tex&amp;gt; (k, m) &amp;lt;/tex&amp;gt;, аналогично путь из &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt; не может содержать &amp;lt;tex&amp;gt; (k, m) &amp;lt;/tex&amp;gt;. Поэтому в &amp;lt;tex&amp;gt; G^- &amp;lt;/tex&amp;gt; существует путь из &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; m &amp;lt;/tex&amp;gt;, не содержащий в себе ребро &amp;lt;tex&amp;gt; (k, m) &amp;lt;/tex&amp;gt;, значит, удаление &amp;lt;tex&amp;gt; (k, m) &amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt; E^- &amp;lt;/tex&amp;gt; не изменит транзитивное замыкание, что противоречит условию минимальности &amp;lt;tex&amp;gt; E^- &amp;lt;/tex&amp;gt;. Поэтому &amp;lt;tex&amp;gt; \forall l: [ k \underset{G}{\leadsto} l \wedge l \underset{G}{\to} m \Longrightarrow k = l ] &amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt; k \underset{G}{\overset{+}{\leadsto}} m &amp;lt;/tex&amp;gt;, существует такая вершина &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt; k \underset{G}{\leadsto} l \wedge l \underset{G}{\to} m &amp;lt;/tex&amp;gt;, что приводит к выводу, что &amp;lt;tex&amp;gt; k \underset{G}{\to} m &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Докажем, что &amp;lt;tex&amp;gt; \left \{  k \underset{G}{\to} m \ | \  \forall l: [ k \underset{G}{\leadsto} l \wedge l \underset{G}{\to} m \Longrightarrow k = l ] \right \} \subseteq  E^- &amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Предположим, что &amp;lt;tex&amp;gt; k \underset{G}{\to} m &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \forall l: [ k \underset{G}{\leadsto} l \wedge l \underset{G}{\to} m \Longrightarrow k = l ] &amp;lt;/tex&amp;gt;. Докажем, что &amp;lt;tex&amp;gt; k G^- m &amp;lt;/tex&amp;gt;, от противного. Предположим, что &amp;lt;tex&amp;gt; (k, m) \notin E^- &amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; ацикличен, &amp;lt;tex&amp;gt; k \neq m &amp;lt;/tex&amp;gt; и поэтому &amp;lt;tex&amp;gt; k \underset{G^-}{\overset{+}{\leadsto}} m &amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt; (k, m) \notin E^- &amp;lt;/tex&amp;gt;, существует вершина &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt; такая, что &amp;lt;tex&amp;gt; k \underset{G^-}{\leadsto} l \wedge l \underset{G^-}{\leadsto} m &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; k \neq l \neq m &amp;lt;/tex&amp;gt;, поэтому &amp;lt;tex&amp;gt; k \underset{G}{\overset{+}{\leadsto}} l \wedge l \underset{G}{\overset{+}{\leadsto}} m &amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; ацикличен, существует вершина &amp;lt;tex&amp;gt; l' \neq k &amp;lt;/tex&amp;gt;, для которой выполняется &amp;lt;tex&amp;gt; k \underset{G}{\overset{+}{\leadsto}} l' \wedge l' \underset{G}{\to} m &amp;lt;/tex&amp;gt;, что противоречит нашему предположению.&lt;br /&gt;
&lt;br /&gt;
Так как множества &amp;lt;tex&amp;gt; E^- &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \left \{  k \underset{G}{\to} m \ | \  \forall l: [ k \underset{G}{\leadsto} l \wedge l \underset{G}{\to} m \Longrightarrow k = l ] \right \} &amp;lt;/tex&amp;gt; включены друг в друга, они совпадают, что и требовалось доказать.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Псевдокод ===&lt;br /&gt;
  &amp;lt;tex&amp;gt; R^- &amp;lt;/tex&amp;gt; = &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt;&lt;br /&gt;
  foreach &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt; in &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt;&lt;br /&gt;
    foreach &amp;lt;tex&amp;gt; b &amp;lt;/tex&amp;gt; in &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt;&lt;br /&gt;
      foreach &amp;lt;tex&amp;gt; c &amp;lt;/tex&amp;gt; in &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt;&lt;br /&gt;
        if &amp;lt;tex&amp;gt; aRb &amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt; bRc &amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt; aRc &amp;lt;/tex&amp;gt;&lt;br /&gt;
          &amp;lt;tex&amp;gt; R^- &amp;lt;/tex&amp;gt;.delete(pair(&amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; c &amp;lt;/tex&amp;gt;))&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Transitive_reduction Wikipedia: Transitive reduction]&lt;br /&gt;
* [http://archive.cs.uu.nl/pub/RUU/CS/techreps/CS-1987/1987-25.pdf J.A. La Poutré and J. van Leeuwen. «Maintenance of transitive closures and transitive reductions of graphs», 1987]&lt;/div&gt;</summary>
		<author><name>94.242.26.14</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9A%D1%8D%D0%BB%D0%B8&amp;diff=59012</id>
		<title>Теорема Кэли</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%9A%D1%8D%D0%BB%D0%B8&amp;diff=59012"/>
				<updated>2017-01-06T23:13:11Z</updated>
		
		<summary type="html">&lt;p&gt;94.242.26.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&lt;br /&gt;
Теорема&lt;br /&gt;
|author=Кэли(''Cayley'')&lt;br /&gt;
|about=о вложении любой конечной группы в группу перестановок&lt;br /&gt;
|statement=&lt;br /&gt;
Любая конечная группа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; изоморфна некоторой подгруппе группы перестановок (симметрической группе).&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\circ&amp;lt;/tex&amp;gt; {{---}} бинарная операция в группе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Рассмотрим некоторый элемент &amp;lt;tex&amp;gt;g \in G&amp;lt;/tex&amp;gt; и функцию &amp;lt;tex&amp;gt;f_g : G \rightarrow G, f_g(x) = g \circ x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;tex&amp;gt;f_g&amp;lt;/tex&amp;gt; {{---}} перестановка, так как &lt;br /&gt;
&lt;br /&gt;
# Для любых &amp;lt;tex&amp;gt;x, y&amp;lt;/tex&amp;gt; таких, что &amp;lt;tex&amp;gt;x \neq y&amp;lt;/tex&amp;gt; верно, что &amp;lt;tex&amp;gt;g \circ x \neq g \circ y&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\Rightarrow f_g&amp;lt;/tex&amp;gt; {{---}} инъекция.&lt;br /&gt;
# Мощность &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; {{---}} конечна &amp;lt;tex&amp;gt;\Rightarrow f_g&amp;lt;/tex&amp;gt; {{---}} биективно, и является перестановкой.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\circ&amp;lt;/tex&amp;gt; {{---}} композиция двух перестановок.&lt;br /&gt;
Если &amp;lt;tex&amp;gt;f_g&amp;lt;/tex&amp;gt; {{---}} перестановка, то &amp;lt;tex&amp;gt;f_{g^{-1}}&amp;lt;/tex&amp;gt; {{---}} обратная перестановка, где &amp;lt;tex&amp;gt;g^{-1}&amp;lt;/tex&amp;gt; {{---}} обратный элемент &amp;lt;tex&amp;gt;g&amp;lt;/tex&amp;gt;, так как &amp;lt;tex&amp;gt; (f_{g^{-1}} \circ f_g) (x) = f_{g^{-1}}(f_g (x)) =g^{-1} \circ g \circ x = x &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Если &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; {{---}} нейтральный элемент в группе, то &amp;lt;tex&amp;gt;f_e&amp;lt;/tex&amp;gt; {{---}} тождественная перестановка.&lt;br /&gt;
Таким образом множество всех функций &amp;lt;tex&amp;gt;K = \{f_g : g \in G\}&amp;lt;/tex&amp;gt; {{---}} подгруппа симметрической группы, так как композиция двух функций из &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; не выводит из &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;, потому что &amp;lt;tex&amp;gt;(f_a \circ f_b)(x) = f_a(f_b(x)) = a \circ b \circ x = f_{a \circ b}(x) = f_c(x) &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;c = a \circ b &amp;lt;/tex&amp;gt;, значит &amp;lt;tex&amp;gt;f_a \circ f_b \in K&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Рассмотрим множество &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;. По доказанному выше, оно является подгруппой симметрической группы. Осталось доказать, что &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;  изоморфны. Для этого рассмотрим функцию &amp;lt;tex&amp;gt;T : G \rightarrow K,\, T(x) = f_x&amp;lt;/tex&amp;gt;. Заметим, что для всех &amp;lt;tex&amp;gt;x \in G \quad(f_g \circ f_h)(x) = f_{(g \circ h)}(x)&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;T(g)\circ T(h) = T(g \circ h)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значит &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; {{---}} гомоморфизм.&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; {{---}} инъекция, потому что &amp;lt;tex&amp;gt;f_g(x) = f_{g'}(x) \Rightarrow g = f_g(x) \circ x^{-1} = f_{g'}(x) \circ x^{-1} = g'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Сюрьективность &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; очевидна из определения &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
То есть &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; {{---}} гомоморфизм и биекция, а значит изоморфизм &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; установлен.&lt;br /&gt;
}}&lt;br /&gt;
==Примеры== &lt;br /&gt;
Примером и иллюстрацией для данной теоремы является группа &amp;lt;tex&amp;gt; \mathbb Z_3&amp;lt;/tex&amp;gt; {{---}} группа остатков по модулю 3, с операцией сложения.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\ \varphi :\mathbb{Z}_3\rightarrow S_3&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \varphi(0)=\begin{bmatrix} 0 &amp;amp; 1 &amp;amp; 2 \\ 0 &amp;amp; 1 &amp;amp; 2 \end{bmatrix} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \varphi(1)=\begin{bmatrix} 0 &amp;amp; 1 &amp;amp; 2   \\ 1 &amp;amp; 2 &amp;amp; 0 \end{bmatrix} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \varphi(2)=\begin{bmatrix} 0 &amp;amp; 1 &amp;amp; 2  \\ 2 &amp;amp; 0 &amp;amp; 1 \end{bmatrix} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Cayley's_theorem Cayley's theorem - Wikipedia, the free encyclopedia]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Комбинаторика]]&lt;/div&gt;</summary>
		<author><name>94.242.26.14</name></author>	</entry>

	</feed>