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

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61304</id>
		<title>Задача о расстановке знаков в выражении</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61304"/>
				<updated>2017-06-04T22:03:10Z</updated>
		
		<summary type="html">&lt;p&gt;Ruslan02: /* Реализация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ Задача&lt;br /&gt;
|definition = &lt;br /&gt;
Пусть задана последовательность неотрицательных чисел &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_1, a_2, \ldots, a_n \ (a_i \geqslant 0)&amp;lt;/tex&amp;gt;. Требуется расставить знаки &amp;lt;tex dpi = &amp;quot;120&amp;quot;&amp;gt;+, \times&amp;lt;/tex&amp;gt; и скобки в последовательности, чтобы значение полученного арифметического выражения было максимальным.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Решение ==&lt;br /&gt;
Данная задача решается с использованием [[Динамическое_программирование | принципа оптимальности на подотрезках]]. Введём матрицу &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; будет равен максимальному значению, достигаемому на подотрезке &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_i, a_{i+1}, \ldots, a_j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Получаем следующие соотношения: &amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][i] = a_i &amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k]+d[k+1][j], d[i][k] \cdot d[k+1][j])] \ (i &amp;lt; j)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Вычислим элементы таблицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, тогда ответом на задачу будет значение &amp;lt;tex&amp;gt;d[1][n]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Рассмотрим ее, например, в такой формулировке. В арифметическом выражении, операндами которого являются целые числа, а операциями — бинарные арифметические операции &amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;, расставить скобки так, чтобы результат оказался максимальным.&lt;br /&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;tex&amp;gt;d[i, j]&amp;lt;/tex&amp;gt; матрицы, размером &amp;lt;tex&amp;gt;n\times n&amp;lt;/tex&amp;gt;, диагональные элементы которой &amp;lt;tex&amp;gt;(d[i, i])&amp;lt;/tex&amp;gt; равны операндам, а для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; все элементы равны &amp;lt;tex&amp;gt;0&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;tex&amp;gt;i &amp;lt; j&amp;lt;/tex&amp;gt;. Если мы предположим, что последней будет выполняться арифметическая операция, расположенная после операнда с номером &amp;lt;tex&amp;gt;k (k &amp;lt; j)&amp;lt;/tex&amp;gt; и эта операция — сложение, то результат подсчета будет равен сумме элементов &amp;lt;tex&amp;gt;d[i, k]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d[k+1, j]&amp;lt;/tex&amp;gt; нашей матрицы. С умножением ситуация несколько более сложная. Так как операндами могут быть и отрицательные числа, то для нахождения максимума из произведений нужно знать не только максимальные, но и минимальные значения для арифметических операций над операндами с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-й и с &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;-й соответственно. Значит для любой последовательности операндов нужно хранить значение как максимально, так и минимально возможного результата выполнения арифметических операций над ними. Однако, дополнительная матрица для хранения минимальных значений не нужна. Так как для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; матрица &amp;lt;tex&amp;gt;d&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;tex&amp;gt;d[j, i]&amp;lt;/tex&amp;gt;. Тогда в общем случае, если после k-го операнда стоит операция умножения, то максимальный результат будет равен &amp;lt;tex&amp;gt;max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] \cdot d[k+1][j]))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  &amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt;// a - заданная последовательность из n элементов&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  '''int maxValueOfExpression'''(a, n):&lt;br /&gt;
    '''for''' i = 1 '''to''' n:&lt;br /&gt;
      d[i][i] = a[i]&lt;br /&gt;
  &lt;br /&gt;
    '''for''' i = n - 1 '''downto''' 1:&lt;br /&gt;
      '''for''' j = i + 1 '''to''' n:&lt;br /&gt;
        '''for''' k = i '''to''' j - 1:&lt;br /&gt;
          d[i][j] = max(d[i][j], max(d[i][k] + d[k + 1][j], d[i][k] * d[k + 1][j]))&lt;br /&gt;
    '''return''' d[1][n]&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
Пусть дана последовательность &amp;lt;tex&amp;gt;2, 1, 1, 2&amp;lt;/tex&amp;gt;. Таблица &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; для неё будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
:{| border = 1; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;9&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Восстановление ответа ==&lt;br /&gt;
С помощью описанного выше алгоритма можно восстановить оптимальное арифметическое выражение. Для этого нужно в таблице &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; хранить каким способом был получен оптимальный ответ. То есть будем хранить &amp;lt;tex&amp;gt;index&amp;lt;/tex&amp;gt; {{---}} границу раздела на 2 подотрезка &amp;lt;tex&amp;gt;(i \ldots index&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;index + 1 \ldots j)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;operation&amp;lt;/tex&amp;gt; {{---}} операцию совершенную над двумя отрезками (&amp;lt;tex&amp;gt;+, \times&amp;lt;/tex&amp;gt;). В итоге для каждого отрезка мы будем знать какой знак и куда поставить. Для простоты будем заключать каждый полученный подотрезок в скобки. Таким образом мы получим выражение, в котором полностью расставлены скобки.&lt;br /&gt;
&lt;br /&gt;
Для вышеприведенного примера таблица будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
:{| border = 1; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;index&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:{| border = 1; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;operation&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
После того, как посчитана динамика, можно рекурсивно восстановить ответ:&lt;br /&gt;
*Если длина текущего отрезка равна &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;, выходим из рекурсии&lt;br /&gt;
*Оборачиваем текущий отрезок &amp;lt;tex&amp;gt; l \ldots r &amp;lt;/tex&amp;gt; в скобки&lt;br /&gt;
*Ставим после элемента последовательности на позиции &amp;lt;tex&amp;gt; d[l][r].index &amp;lt;/tex&amp;gt; знак &amp;lt;tex&amp;gt; d[l][r].operation &amp;lt;/tex&amp;gt;&lt;br /&gt;
*Рекурсивно запускаем от отрезков &amp;lt;tex&amp;gt; l \ldots d[l][r].index &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; d[l][r].index + 1 \ldots r &amp;lt;/tex&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Таким образом ответ &amp;lt;tex&amp;gt; ((2+1)\times(1+2))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Решение задачи без возможности использования скобок ==&lt;br /&gt;
При условии задачи, в котором запрещено использовать скобки, вышеописанный алгоритм будет работать некорректно. Дело в том, что если на отрезке &amp;lt;tex&amp;gt;k\ldots j&amp;lt;/tex&amp;gt; была использована операция сложения, то мы не можем перемножить результаты на отрезке &amp;lt;tex&amp;gt;i\ldots k - 1&amp;lt;/tex&amp;gt; и отрезке &amp;lt;tex&amp;gt;k\ldots j&amp;lt;/tex&amp;gt;. Для решения этой проблемы будем использовать две матрицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; {{---}} такую же как и раньше, а также &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(p[i][j]&amp;lt;/tex&amp;gt; {{---}} произведение чисел &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_i, a_{i+1}, \ldots, a_j)&amp;lt;/tex&amp;gt;.  Тогда получим новую формулу пересчета динамики:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k] + d[k + 1][j],  p[i][k] \cdot p[k + 1][j])] \ (i &amp;lt; j)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Задача о порядке перемножения матриц | Задача о порядке перемножения матриц]]&lt;br /&gt;
*[[Задача о наибольшей общей подпоследовательности | Задача о наибольшей общей подпоследовательности]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации==&lt;br /&gt;
*[http://fvn2009.narod.ru/Olympiads/Rules_Olympiads/Rules22.htm Олимпиадные задачи и решения {{---}} Классические задачи динамического программирования]&lt;br /&gt;
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>Ruslan02</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61303</id>
		<title>Задача о расстановке знаков в выражении</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61303"/>
				<updated>2017-06-04T21:54:48Z</updated>
		
		<summary type="html">&lt;p&gt;Ruslan02: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ Задача&lt;br /&gt;
|definition = &lt;br /&gt;
Пусть задана последовательность неотрицательных чисел &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_1, a_2, \ldots, a_n \ (a_i \geqslant 0)&amp;lt;/tex&amp;gt;. Требуется расставить знаки &amp;lt;tex dpi = &amp;quot;120&amp;quot;&amp;gt;+, \times&amp;lt;/tex&amp;gt; и скобки в последовательности, чтобы значение полученного арифметического выражения было максимальным.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Решение ==&lt;br /&gt;
Данная задача решается с использованием [[Динамическое_программирование | принципа оптимальности на подотрезках]]. Введём матрицу &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; будет равен максимальному значению, достигаемому на подотрезке &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_i, a_{i+1}, \ldots, a_j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Получаем следующие соотношения: &amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][i] = a_i &amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k]+d[k+1][j], d[i][k] \cdot d[k+1][j])] \ (i &amp;lt; j)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Вычислим элементы таблицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, тогда ответом на задачу будет значение &amp;lt;tex&amp;gt;d[1][n]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Рассмотрим ее, например, в такой формулировке. В арифметическом выражении, операндами которого являются целые числа, а операциями — бинарные арифметические операции &amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;, расставить скобки так, чтобы результат оказался максимальным.&lt;br /&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;tex&amp;gt;d[i, j]&amp;lt;/tex&amp;gt; матрицы, размером &amp;lt;tex&amp;gt;n\times n&amp;lt;/tex&amp;gt;, диагональные элементы которой &amp;lt;tex&amp;gt;(d[i, i])&amp;lt;/tex&amp;gt; равны операндам, а для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; все элементы равны &amp;lt;tex&amp;gt;0&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;tex&amp;gt;i &amp;lt; j&amp;lt;/tex&amp;gt;. Если мы предположим, что последней будет выполняться арифметическая операция, расположенная после операнда с номером &amp;lt;tex&amp;gt;k (k &amp;lt; j)&amp;lt;/tex&amp;gt; и эта операция — сложение, то результат подсчета будет равен сумме элементов &amp;lt;tex&amp;gt;d[i, k]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d[k+1, j]&amp;lt;/tex&amp;gt; нашей матрицы. С умножением ситуация несколько более сложная. Так как операндами могут быть и отрицательные числа, то для нахождения максимума из произведений нужно знать не только максимальные, но и минимальные значения для арифметических операций над операндами с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-й и с &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;-й соответственно. Значит для любой последовательности операндов нужно хранить значение как максимально, так и минимально возможного результата выполнения арифметических операций над ними. Однако, дополнительная матрица для хранения минимальных значений не нужна. Так как для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; матрица &amp;lt;tex&amp;gt;d&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;tex&amp;gt;d[j, i]&amp;lt;/tex&amp;gt;. Тогда в общем случае, если после k-го операнда стоит операция умножения, то максимальный результат будет равен &amp;lt;tex&amp;gt;max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] \cdot d[k+1][j]))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  &amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt;// a - заданная последовательность из n элементов&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  '''int maxValueOfExpression'''(a, n):&lt;br /&gt;
    '''for''' i = 1 '''to''' n:&lt;br /&gt;
      d[i][i] = a[i];&lt;br /&gt;
  &lt;br /&gt;
    '''for''' i = n - 1 '''downto''' 1:&lt;br /&gt;
      '''for''' j = i + 1 '''to''' n:&lt;br /&gt;
        '''for''' k = i '''to''' j - 1:&lt;br /&gt;
          d[i][j] = max(d[i][j], max(d[i][k] + d[k + 1][j], d[i][k] * d[k + 1][j]))&lt;br /&gt;
    '''return''' d[1][n]&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
Пусть дана последовательность &amp;lt;tex&amp;gt;2, 1, 1, 2&amp;lt;/tex&amp;gt;. Таблица &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; для неё будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
:{| border = 1; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;9&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Восстановление ответа ==&lt;br /&gt;
С помощью описанного выше алгоритма можно восстановить оптимальное арифметическое выражение. Для этого нужно в таблице &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; хранить каким способом был получен оптимальный ответ. То есть будем хранить &amp;lt;tex&amp;gt;index&amp;lt;/tex&amp;gt; {{---}} границу раздела на 2 подотрезка &amp;lt;tex&amp;gt;(i \ldots index&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;index + 1 \ldots j)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;operation&amp;lt;/tex&amp;gt; {{---}} операцию совершенную над двумя отрезками (&amp;lt;tex&amp;gt;+, \times&amp;lt;/tex&amp;gt;). В итоге для каждого отрезка мы будем знать какой знак и куда поставить. Для простоты будем заключать каждый полученный подотрезок в скобки. Таким образом мы получим выражение, в котором полностью расставлены скобки.&lt;br /&gt;
&lt;br /&gt;
Для вышеприведенного примера таблица будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
:{| border = 1; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;index&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:{| border = 1; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;operation&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
После того, как посчитана динамика, можно рекурсивно восстановить ответ:&lt;br /&gt;
*Если длина текущего отрезка равна &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;, выходим из рекурсии&lt;br /&gt;
*Оборачиваем текущий отрезок &amp;lt;tex&amp;gt; l \ldots r &amp;lt;/tex&amp;gt; в скобки&lt;br /&gt;
*Ставим после элемента последовательности на позиции &amp;lt;tex&amp;gt; d[l][r].index &amp;lt;/tex&amp;gt; знак &amp;lt;tex&amp;gt; d[l][r].operation &amp;lt;/tex&amp;gt;&lt;br /&gt;
*Рекурсивно запускаем от отрезков &amp;lt;tex&amp;gt; l \ldots d[l][r].index &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; d[l][r].index + 1 \ldots r &amp;lt;/tex&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Таким образом ответ &amp;lt;tex&amp;gt; ((2+1)\times(1+2))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Решение задачи без возможности использования скобок ==&lt;br /&gt;
При условии задачи, в котором запрещено использовать скобки, вышеописанный алгоритм будет работать некорректно. Дело в том, что если на отрезке &amp;lt;tex&amp;gt;k\ldots j&amp;lt;/tex&amp;gt; была использована операция сложения, то мы не можем перемножить результаты на отрезке &amp;lt;tex&amp;gt;i\ldots k - 1&amp;lt;/tex&amp;gt; и отрезке &amp;lt;tex&amp;gt;k\ldots j&amp;lt;/tex&amp;gt;. Для решения этой проблемы будем использовать две матрицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; {{---}} такую же как и раньше, а также &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(p[i][j]&amp;lt;/tex&amp;gt; {{---}} произведение чисел &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_i, a_{i+1}, \ldots, a_j)&amp;lt;/tex&amp;gt;.  Тогда получим новую формулу пересчета динамики:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k] + d[k + 1][j],  p[i][k] \cdot p[k + 1][j])] \ (i &amp;lt; j)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Задача о порядке перемножения матриц | Задача о порядке перемножения матриц]]&lt;br /&gt;
*[[Задача о наибольшей общей подпоследовательности | Задача о наибольшей общей подпоследовательности]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации==&lt;br /&gt;
*[http://fvn2009.narod.ru/Olympiads/Rules_Olympiads/Rules22.htm Олимпиадные задачи и решения {{---}} Классические задачи динамического программирования]&lt;br /&gt;
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>Ruslan02</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61302</id>
		<title>Задача о расстановке знаков в выражении</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61302"/>
				<updated>2017-06-04T21:50:09Z</updated>
		
		<summary type="html">&lt;p&gt;Ruslan02: /* Восстановление ответа */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ Задача&lt;br /&gt;
|definition = &lt;br /&gt;
Пусть задана последовательность неотрицательных чисел &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_1, a_2, \ldots, a_n \ (a_i \geqslant 0)&amp;lt;/tex&amp;gt;. Требуется расставить знаки &amp;lt;tex dpi = &amp;quot;120&amp;quot;&amp;gt;+, \times&amp;lt;/tex&amp;gt; и скобки в последовательности, чтобы значение полученного арифметического выражения было максимальным.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Решение ==&lt;br /&gt;
Данная задача решается с использованием [[Динамическое_программирование | принципа оптимальности на подотрезках]]. Введём матрицу &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; будет равен максимальному значению, достигаемому на подотрезке &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_i, a_{i+1}, \ldots, a_j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Получаем следующие соотношения: &amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][i] = a_i &amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k]+d[k+1][j], d[i][k] \cdot d[k+1][j])] \ (i &amp;lt; j)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Вычислим элементы таблицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, тогда ответом на задачу будет значение &amp;lt;tex&amp;gt;d[1][n]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Рассмотрим ее, например, в такой формулировке. В арифметическом выражении, операндами которого являются целые числа, а операциями — бинарные арифметические операции &amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;, расставить скобки так, чтобы результат оказался максимальным.&lt;br /&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;tex&amp;gt;d[i, j]&amp;lt;/tex&amp;gt; матрицы, размером &amp;lt;tex&amp;gt;n\times n&amp;lt;/tex&amp;gt;, диагональные элементы которой &amp;lt;tex&amp;gt;(d[i, i])&amp;lt;/tex&amp;gt; равны операндам, а для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; все элементы равны &amp;lt;tex&amp;gt;0&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;tex&amp;gt;i &amp;lt; j&amp;lt;/tex&amp;gt;. Если мы предположим, что последней будет выполняться арифметическая операция, расположенная после операнда с номером &amp;lt;tex&amp;gt;k (k &amp;lt; j)&amp;lt;/tex&amp;gt; и эта операция — сложение, то результат подсчета будет равен сумме элементов &amp;lt;tex&amp;gt;d[i, k]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d[k+1, j]&amp;lt;/tex&amp;gt; нашей матрицы. С умножением ситуация несколько более сложная. Так как операндами могут быть и отрицательные числа, то для нахождения максимума из произведений нужно знать не только максимальные, но и минимальные значения для арифметических операций над операндами с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-й и с &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;-й соответственно. Значит для любой последовательности операндов нужно хранить значение как максимально, так и минимально возможного результата выполнения арифметических операций над ними. Однако, дополнительная матрица для хранения минимальных значений не нужна. Так как для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; матрица &amp;lt;tex&amp;gt;d&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;tex&amp;gt;d[j, i]&amp;lt;/tex&amp;gt;. Тогда в общем случае, если после k-го операнда стоит операция умножения, то максимальный результат будет равен &amp;lt;tex&amp;gt;max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] \cdot d[k+1][j]))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  &amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt;// a - заданная последовательность из n элементов&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  '''int maxValueOfExpression'''(a, n):&lt;br /&gt;
    '''for''' i = 1 '''to''' n:&lt;br /&gt;
      d[i][i] = a[i];&lt;br /&gt;
  &lt;br /&gt;
    '''for''' i = n - 1 '''downto''' 1:&lt;br /&gt;
      '''for''' j = i + 1 '''to''' n:&lt;br /&gt;
        '''for''' k = i '''to''' j - 1:&lt;br /&gt;
          d[i][j] = max(d[i][j], max(d[i][k] + d[k + 1][j], d[i][k] * d[k + 1][j]))&lt;br /&gt;
    '''return''' d[1][n]&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
Пусть дана последовательность &amp;lt;tex&amp;gt;2, 1, 1, 2&amp;lt;/tex&amp;gt;. Таблица &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; для неё будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
:{| border = 1; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;9&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Восстановление ответа ==&lt;br /&gt;
С помощью описанного выше алгоритма можно восстановить оптимальное арифметическое выражение. Для этого нужно в таблице &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; хранить каким способом был получен оптимальный ответ. То есть будем хранить &amp;lt;tex&amp;gt;index&amp;lt;/tex&amp;gt; {{---}} границу раздела на 2 подотрезка &amp;lt;tex&amp;gt;(i \ldots index&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;index + 1 \ldots j)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;operation&amp;lt;/tex&amp;gt; {{---}} операцию совершенную над двумя отрезками (&amp;lt;tex&amp;gt;+, \times&amp;lt;/tex&amp;gt;). В итоге для каждого отрезка мы будем знать какой знак и куда поставить. Для простоты будем заключать каждый полученный подотрезок в скобки. Таким образом мы получим выражение, в котором полностью расставлены скобки.&lt;br /&gt;
&lt;br /&gt;
Для вышеприведенного примера таблица будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
:{| border = 1; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;index&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:{| border = 1; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;operation&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
После того, как посчитана динамика, можно рекурсивно восстановить ответ:&lt;br /&gt;
*Если длина текущего отрезка равна &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;, выходим из рекурсии&lt;br /&gt;
*Оборачиваем текущий отрезок &amp;lt;tex&amp;gt; l \ldots r &amp;lt;/tex&amp;gt; в скобки&lt;br /&gt;
*Ставим после элемента последовательности на позиции &amp;lt;tex&amp;gt; d[l][r].index &amp;lt;/tex&amp;gt; знак &amp;lt;tex&amp;gt; d[l][r].operation &amp;lt;/tex&amp;gt;&lt;br /&gt;
*Рекурсивно запускаем от отрезков &amp;lt;tex&amp;gt; l \ldots d[l][r].index &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; d[l][r].index + 1 \ldots r &amp;lt;/tex&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Таким образом ответ &amp;lt;tex&amp;gt; ((2+1)\times(1+2))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Решение задачи без возможности использования скобок ==&lt;br /&gt;
При условии задачи, в котором запрещено использовать скобки, вышеописанный алгоритм будет работать некорректно. Дело в том, что если на отрезке &amp;lt;tex&amp;gt;k\ldots j&amp;lt;/tex&amp;gt; была использована операция сложения, то мы не можем перемножить результаты на отрезке &amp;lt;tex&amp;gt;i\ldots k - 1&amp;lt;/tex&amp;gt; и отрезке &amp;lt;tex&amp;gt;k\ldots j&amp;lt;/tex&amp;gt;. Для решения этой проблемы будем использовать две матрицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; {{---}} такую же как и раньше, а также &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(p[i][j]&amp;lt;/tex&amp;gt; {{---}} произведение чисел &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_i, a_{i+1}, \ldots, a_j)&amp;lt;/tex&amp;gt;.  Тогда получим новую формулу пересчета динамики:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k] + d[k + 1][j],  p[i][k] \cdot p[k + 1][j])] \ (i &amp;lt; j)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Источники информации==&lt;br /&gt;
*[http://fvn2009.narod.ru/Olympiads/Rules_Olympiads/Rules22.htm Олимпиадные задачи и решения {{---}} Классические задачи динамического программирования]&lt;br /&gt;
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>Ruslan02</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61301</id>
		<title>Задача о расстановке знаков в выражении</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61301"/>
				<updated>2017-06-04T21:41:34Z</updated>
		
		<summary type="html">&lt;p&gt;Ruslan02: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ Задача&lt;br /&gt;
|definition = &lt;br /&gt;
Пусть задана последовательность неотрицательных чисел &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_1, a_2, \ldots, a_n \ (a_i \geqslant 0)&amp;lt;/tex&amp;gt;. Требуется расставить знаки &amp;lt;tex dpi = &amp;quot;120&amp;quot;&amp;gt;+, \times&amp;lt;/tex&amp;gt; и скобки в последовательности, чтобы значение полученного арифметического выражения было максимальным.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Решение ==&lt;br /&gt;
Данная задача решается с использованием [[Динамическое_программирование | принципа оптимальности на подотрезках]]. Введём матрицу &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; будет равен максимальному значению, достигаемому на подотрезке &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_i, a_{i+1}, \ldots, a_j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Получаем следующие соотношения: &amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][i] = a_i &amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k]+d[k+1][j], d[i][k] \cdot d[k+1][j])] \ (i &amp;lt; j)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Вычислим элементы таблицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, тогда ответом на задачу будет значение &amp;lt;tex&amp;gt;d[1][n]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Рассмотрим ее, например, в такой формулировке. В арифметическом выражении, операндами которого являются целые числа, а операциями — бинарные арифметические операции &amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;, расставить скобки так, чтобы результат оказался максимальным.&lt;br /&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;tex&amp;gt;d[i, j]&amp;lt;/tex&amp;gt; матрицы, размером &amp;lt;tex&amp;gt;n\times n&amp;lt;/tex&amp;gt;, диагональные элементы которой &amp;lt;tex&amp;gt;(d[i, i])&amp;lt;/tex&amp;gt; равны операндам, а для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; все элементы равны &amp;lt;tex&amp;gt;0&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;tex&amp;gt;i &amp;lt; j&amp;lt;/tex&amp;gt;. Если мы предположим, что последней будет выполняться арифметическая операция, расположенная после операнда с номером &amp;lt;tex&amp;gt;k (k &amp;lt; j)&amp;lt;/tex&amp;gt; и эта операция — сложение, то результат подсчета будет равен сумме элементов &amp;lt;tex&amp;gt;d[i, k]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d[k+1, j]&amp;lt;/tex&amp;gt; нашей матрицы. С умножением ситуация несколько более сложная. Так как операндами могут быть и отрицательные числа, то для нахождения максимума из произведений нужно знать не только максимальные, но и минимальные значения для арифметических операций над операндами с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-й и с &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;-й соответственно. Значит для любой последовательности операндов нужно хранить значение как максимально, так и минимально возможного результата выполнения арифметических операций над ними. Однако, дополнительная матрица для хранения минимальных значений не нужна. Так как для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; матрица &amp;lt;tex&amp;gt;d&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;tex&amp;gt;d[j, i]&amp;lt;/tex&amp;gt;. Тогда в общем случае, если после k-го операнда стоит операция умножения, то максимальный результат будет равен &amp;lt;tex&amp;gt;max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] \cdot d[k+1][j]))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  &amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt;// a - заданная последовательность из n элементов&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  '''int maxValueOfExpression'''(a, n):&lt;br /&gt;
    '''for''' i = 1 '''to''' n:&lt;br /&gt;
      d[i][i] = a[i];&lt;br /&gt;
  &lt;br /&gt;
    '''for''' i = n - 1 '''downto''' 1:&lt;br /&gt;
      '''for''' j = i + 1 '''to''' n:&lt;br /&gt;
        '''for''' k = i '''to''' j - 1:&lt;br /&gt;
          d[i][j] = max(d[i][j], max(d[i][k] + d[k + 1][j], d[i][k] * d[k + 1][j]))&lt;br /&gt;
    '''return''' d[1][n]&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
Пусть дана последовательность &amp;lt;tex&amp;gt;2, 1, 1, 2&amp;lt;/tex&amp;gt;. Таблица &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; для неё будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
:{| border = 1; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;9&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Восстановление ответа ==&lt;br /&gt;
С помощью описанного выше алгоритма можно восстановить оптимальное арифметическое выражение. Для этого нужно в таблице &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; хранить каким способом был получен оптимальный ответ. То есть будем хранить &amp;lt;tex&amp;gt;index&amp;lt;/tex&amp;gt; {{---}} границу раздела на 2 подотрезка &amp;lt;tex&amp;gt;(i \ldots index&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;index + 1 \ldots j)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;operation&amp;lt;/tex&amp;gt; {{---}} операцию совершенную над двумя отрезками (&amp;lt;tex&amp;gt;+, \times&amp;lt;/tex&amp;gt;). В итоге для каждого отрезка мы будем знать какой знак и куда поставить. Для простоты будем заключать каждый полученный подотрезок в скобки. Таким образом мы получим выражение, в котором полностью расставлены скобки.&lt;br /&gt;
&lt;br /&gt;
Для вышеприведенного примера таблица будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
:{| border = 1; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;index&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:{| border = 1; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;operation&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
После того, как посчитана динамика, можно рекурсивно восстановить ответ:&lt;br /&gt;
*Если длина текущего отрезка равна &amp;lt;tex&amp;gt; 1 &amp;lt;/tex&amp;gt;, выходим из рекурсии&lt;br /&gt;
*Оборачиваем текущий отрезок &amp;lt;tex&amp;gt; l \ldots r &amp;lt;/tex&amp;gt; в скобки&lt;br /&gt;
*Ставим после элемента последовательности на позиции &amp;lt;tex&amp;gt; d[l][r].index &amp;lt;/tex&amp;gt; знак &amp;lt;tex&amp;gt; d[l][r].operation &amp;lt;/tex&amp;gt;&lt;br /&gt;
*Рекурсивно запускаем от отрезков &amp;lt;tex&amp;gt; l \ldots d[l][r].index &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; d[l][r].index + 1 \ldots r &amp;lt;/tex&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
Таким образом ответ &amp;lt;tex&amp;gt; ((2+1)\times(1+2))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Решение задачи без возможности использования скобок ==&lt;br /&gt;
При условии задачи, в котором запрещено использовать скобки, вышеописанный алгоритм будет работать некорректно. Дело в том, что если на отрезке &amp;lt;tex&amp;gt;k\ldots j&amp;lt;/tex&amp;gt; была использована операция сложения, то мы не можем перемножить результаты на отрезке &amp;lt;tex&amp;gt;i\ldots k - 1&amp;lt;/tex&amp;gt; и отрезке &amp;lt;tex&amp;gt;k\ldots j&amp;lt;/tex&amp;gt;. Для решения этой проблемы будем использовать две матрицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; {{---}} такую же как и раньше, а также &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(p[i][j]&amp;lt;/tex&amp;gt; {{---}} произведение чисел &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_i, a_{i+1}, \ldots, a_j)&amp;lt;/tex&amp;gt;.  Тогда получим новую формулу пересчета динамики:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k] + d[k + 1][j],  p[i][k] \cdot p[k + 1][j])] \ (i &amp;lt; j)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Источники информации==&lt;br /&gt;
*[http://fvn2009.narod.ru/Olympiads/Rules_Olympiads/Rules22.htm Олимпиадные задачи и решения {{---}} Классические задачи динамического программирования]&lt;br /&gt;
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>Ruslan02</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61288</id>
		<title>Задача о расстановке знаков в выражении</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61288"/>
				<updated>2017-06-04T19:39:43Z</updated>
		
		<summary type="html">&lt;p&gt;Ruslan02: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ Задача&lt;br /&gt;
|definition = &lt;br /&gt;
Пусть задана последовательность неотрицательных чисел &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_1, a_2, \dots, a_n \ (a_i \ge 0)&amp;lt;/tex&amp;gt;. Требуется расставить знаки &amp;lt;tex dpi = &amp;quot;120&amp;quot;&amp;gt;+, \times&amp;lt;/tex&amp;gt; и скобки в последовательности, чтобы значение полученного арифметического выражения было максимальным.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Решение ==&lt;br /&gt;
Данная задача решается с использованием [[Динамическое_программирование | принципа оптимальности на подотрезках]]. Введём матрицу &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; будет равен максимальному значению, достигаемому на подотрезке &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_i, a_{i+1}, \dots, a_j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Получаем следующие соотношения: &amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][i] = a_i &amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k]+d[k+1][j], d[i][k] \times d[k+1][j])] \ (i &amp;lt; j)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Вычислим элементы таблицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, тогда ответом на задачу будет значение &amp;lt;tex&amp;gt;d[1][n]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Рассмотрим ее, например, в такой формулировке. В арифметическом выражении, операндами которого являются целые числа, а операциями — бинарные арифметические операции &amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;, расставить скобки так, чтобы результат оказался максимальным.&lt;br /&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;tex&amp;gt;d[i, j]&amp;lt;/tex&amp;gt; матрицы, размером &amp;lt;tex&amp;gt;n\times n&amp;lt;/tex&amp;gt;, диагональные элементы которой &amp;lt;tex&amp;gt;(d[i, i])&amp;lt;/tex&amp;gt; равны операндам, а для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; все элементы равны &amp;lt;tex&amp;gt;0&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;tex&amp;gt;i &amp;lt; j&amp;lt;/tex&amp;gt;. Если мы предположим, что последней будет выполняться арифметическая операция, расположенная после операнда с номером &amp;lt;tex&amp;gt;k (k &amp;lt; j)&amp;lt;/tex&amp;gt; и эта операция — сложение, то результат подсчета будет равен сумме элементов &amp;lt;tex&amp;gt;d[i, k]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d[k+1, j]&amp;lt;/tex&amp;gt; нашей матрицы. С умножением ситуация несколько более сложная. Так как операндами могут быть и отрицательные числа, то для нахождения максимума из произведений нужно знать не только максимальные, но и минимальные значения для арифметических операций над операндами с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-й и с &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;-й соответственно. Значит для любой последовательности операндов нужно хранить значение как максимально, так и минимально возможного результата выполнения арифметических операций над ними. Однако, дополнительная матрица для хранения минимальных значений не нужна. Так как для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; матрица &amp;lt;tex&amp;gt;d&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;tex&amp;gt;d[j, i]&amp;lt;/tex&amp;gt;. Тогда в общем случае, если после k-го операнда стоит операция умножения, то максимальный результат будет равен &amp;lt;tex&amp;gt;max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] \times d[k+1][j]))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  &amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt;// d - матрица как в описании; a - последовательность из n элементов; i, j, k - счётчики&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  '''for''' i = 1 '''to''' n:&lt;br /&gt;
    d[i][i] = a[i];&lt;br /&gt;
  &lt;br /&gt;
  '''for''' i = n - 1 '''downto''' 1:&lt;br /&gt;
    '''for''' j = i + 1 '''to''' n:&lt;br /&gt;
      '''for''' k = i '''to''' j - 1:&lt;br /&gt;
        d[i][j] = max(d[i][j], max(d[i][k] + d[k + 1][j], d[i][k] * d[k + 1][j]));&lt;br /&gt;
  &lt;br /&gt;
  '''print'''(d[1][n]);            &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// вывод ответа&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
Пусть дана последовательность &amp;lt;tex&amp;gt;2, 1, 1, 2&amp;lt;/tex&amp;gt;. Таблица &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; для неё будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
:{| border = 1; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;9&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Восстановление ответа ==&lt;br /&gt;
С помощью описанного выше алгоритма можно восстановить оптимальное арифметическое выражение. Для этого нужно в таблице &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; хранить каким способом был получен оптимальный ответ. То есть будем хранить &amp;lt;tex&amp;gt;index&amp;lt;/tex&amp;gt; {{---}} границу раздела на 2 подотрезка и &amp;lt;tex&amp;gt;operation&amp;lt;/tex&amp;gt; {{---}} операцию совершенную над двумя отрезками (&amp;lt;tex&amp;gt;+, \times&amp;lt;/tex&amp;gt;). В итоге для каждого отрезка мы будем знать какой знак и куда поставить. Для простоты будем заключать каждый полученный подотрезок в скобки. Таким образом мы получим выражение, в котором полностью расставлены скобки.&lt;br /&gt;
&lt;br /&gt;
Для вышеприведенного примера ответ будет выглядеть так &amp;lt;tex&amp;gt; (2+1)\times(1+2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Решение задачи без возможности использования скобок ==&lt;br /&gt;
При условии задачи, в котором запрещено использовать скобки, вышеописанный алгоритм будет работать некорректно. Дело в том, что если на отрезке &amp;lt;tex&amp;gt;k\dots j&amp;lt;/tex&amp;gt; была использована операция сложения, то мы не можем перемножить результаты на отрезке &amp;lt;tex&amp;gt;i\dots k - 1&amp;lt;/tex&amp;gt; и отрезке &amp;lt;tex&amp;gt;k\dots j&amp;lt;/tex&amp;gt;. Для решения этой проблемы будем использовать две матрицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; {{---}} такую же как и раньше, а также &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;(p[i][j]&amp;lt;/tex&amp;gt; {{---}} произведение чисел &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_i, a_{i+1}, \dots, a_j)&amp;lt;/tex&amp;gt;.  Тогда получим новую формулу пересчета динамики:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k] + d[k + 1][j],  p[i][k] \times p[k + 1][j])] \ (i &amp;lt; j)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
*[http://fvn2009.narod.ru/Olympiads/Rules_Olympiads/Rules22.htm Олимпиадные задачи и решения {{---}} Классические задачи динамического программирования]&lt;br /&gt;
&lt;br /&gt;
== Список литературы ==&lt;br /&gt;
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>Ruslan02</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61281</id>
		<title>Задача о расстановке знаков в выражении</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61281"/>
				<updated>2017-06-04T18:00:23Z</updated>
		
		<summary type="html">&lt;p&gt;Ruslan02: /* Источники */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ Задача&lt;br /&gt;
|definition = &lt;br /&gt;
Пусть задана последовательность неотрицательных чисел &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_1, a_2, \dots, a_n \ (a_i \ge 0)&amp;lt;/tex&amp;gt;. Требуется расставить знаки &amp;lt;tex dpi = &amp;quot;120&amp;quot;&amp;gt;+, \times&amp;lt;/tex&amp;gt; и скобки в последовательности, чтобы значение полученного арифметического выражения было максимальным.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Решение ==&lt;br /&gt;
Данная задача решается с использованием [[Динамическое_программирование | принципа оптимальности на подотрезках]]. Введём матрицу &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; будет равен максимальному значению, достигаемому на подотрезке &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_i, a_{i+1}, \dots, a_j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Получаем следующие соотношения: &amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][i] = a_i &amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k]+d[k+1][j], d[i][k] \times d[k+1][j])] \ (i &amp;lt; j)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Вычислим элементы таблицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, тогда ответом на задачу будет значение &amp;lt;tex&amp;gt;d[1][n]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Рассмотрим ее, например, в такой формулировке. В арифметическом выражении, операндами которого являются целые числа, а операциями — бинарные арифметические операции &amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;, расставить скобки так, чтобы результат оказался максимальным.&lt;br /&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;tex&amp;gt;d[i, j]&amp;lt;/tex&amp;gt; матрицы, размером &amp;lt;tex&amp;gt;n\times n&amp;lt;/tex&amp;gt;, диагональные элементы которой &amp;lt;tex&amp;gt;(d[i, i])&amp;lt;/tex&amp;gt; равны операндам, а для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; все элементы равны &amp;lt;tex&amp;gt;0&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;tex&amp;gt;i &amp;lt; j&amp;lt;/tex&amp;gt;. Если мы предположим, что последней будет выполняться арифметическая операция, расположенная после операнда с номером &amp;lt;tex&amp;gt;k (k &amp;lt; j)&amp;lt;/tex&amp;gt; и эта операция — сложение, то результат подсчета будет равен сумме элементов &amp;lt;tex&amp;gt;d[i, k]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d[k+1, j]&amp;lt;/tex&amp;gt; нашей матрицы. С умножением ситуация несколько более сложная. Так как операндами могут быть и отрицательные числа, то для нахождения максимума из произведений нужно знать не только максимальные, но и минимальные значения для арифметических операций над операндами с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-й и с &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;-й соответственно. Значит для любой последовательности операндов нужно хранить значение как максимально, так и минимально возможного результата выполнения арифметических операций над ними. Однако, дополнительная матрица для хранения минимальных значений не нужна. Так как для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; матрица &amp;lt;tex&amp;gt;d&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;tex&amp;gt;d[j, i]&amp;lt;/tex&amp;gt;. Тогда в общем случае, если после k-го операнда стоит операция умножения, то максимальный результат будет равен &amp;lt;tex&amp;gt;max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] \times d[k+1][j]))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  &amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt;// d - матрица как в описании; a - последовательность из n элементов; i, j, k - счётчики&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  '''for''' i = 1 '''to''' n:&lt;br /&gt;
    d[i][i] = a[i];&lt;br /&gt;
  &lt;br /&gt;
  '''for''' i = n - 1 '''downto''' 1:&lt;br /&gt;
    '''for''' j = i + 1 '''to''' n:&lt;br /&gt;
      '''for''' k = i '''to''' j - 1:&lt;br /&gt;
        d[i][j] = max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] * d[k + 1][j]));&lt;br /&gt;
  &lt;br /&gt;
  '''print'''(d[1][n]);            &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// вывод ответа&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
Пусть дана последовательность &amp;lt;tex&amp;gt;2, 1, 1, 2&amp;lt;/tex&amp;gt;. Таблица &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; для неё будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
:{| border = 1; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;9&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
*[http://fvn2009.narod.ru/Olympiads/Rules_Olympiads/Rules22.htm Олимпиадные задачи и решения {{---}} Классические задачи динамического программирования]&lt;br /&gt;
&lt;br /&gt;
== Список литературы ==&lt;br /&gt;
* Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>Ruslan02</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61280</id>
		<title>Задача о расстановке знаков в выражении</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61280"/>
				<updated>2017-06-04T17:51:32Z</updated>
		
		<summary type="html">&lt;p&gt;Ruslan02: /* Реализация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ Задача&lt;br /&gt;
|definition = &lt;br /&gt;
Пусть задана последовательность неотрицательных чисел &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_1, a_2, \dots, a_n \ (a_i \ge 0)&amp;lt;/tex&amp;gt;. Требуется расставить знаки &amp;lt;tex dpi = &amp;quot;120&amp;quot;&amp;gt;+, \times&amp;lt;/tex&amp;gt; и скобки в последовательности, чтобы значение полученного арифметического выражения было максимальным.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Решение ==&lt;br /&gt;
Данная задача решается с использованием [[Динамическое_программирование | принципа оптимальности на подотрезках]]. Введём матрицу &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; будет равен максимальному значению, достигаемому на подотрезке &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_i, a_{i+1}, \dots, a_j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Получаем следующие соотношения: &amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][i] = a_i &amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k]+d[k+1][j], d[i][k] \times d[k+1][j])] \ (i &amp;lt; j)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Вычислим элементы таблицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, тогда ответом на задачу будет значение &amp;lt;tex&amp;gt;d[1][n]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Рассмотрим ее, например, в такой формулировке. В арифметическом выражении, операндами которого являются целые числа, а операциями — бинарные арифметические операции &amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;, расставить скобки так, чтобы результат оказался максимальным.&lt;br /&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;tex&amp;gt;d[i, j]&amp;lt;/tex&amp;gt; матрицы, размером &amp;lt;tex&amp;gt;n\times n&amp;lt;/tex&amp;gt;, диагональные элементы которой &amp;lt;tex&amp;gt;(d[i, i])&amp;lt;/tex&amp;gt; равны операндам, а для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; все элементы равны &amp;lt;tex&amp;gt;0&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;tex&amp;gt;i &amp;lt; j&amp;lt;/tex&amp;gt;. Если мы предположим, что последней будет выполняться арифметическая операция, расположенная после операнда с номером &amp;lt;tex&amp;gt;k (k &amp;lt; j)&amp;lt;/tex&amp;gt; и эта операция — сложение, то результат подсчета будет равен сумме элементов &amp;lt;tex&amp;gt;d[i, k]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d[k+1, j]&amp;lt;/tex&amp;gt; нашей матрицы. С умножением ситуация несколько более сложная. Так как операндами могут быть и отрицательные числа, то для нахождения максимума из произведений нужно знать не только максимальные, но и минимальные значения для арифметических операций над операндами с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-й и с &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;-й соответственно. Значит для любой последовательности операндов нужно хранить значение как максимально, так и минимально возможного результата выполнения арифметических операций над ними. Однако, дополнительная матрица для хранения минимальных значений не нужна. Так как для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; матрица &amp;lt;tex&amp;gt;d&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;tex&amp;gt;d[j, i]&amp;lt;/tex&amp;gt;. Тогда в общем случае, если после k-го операнда стоит операция умножения, то максимальный результат будет равен &amp;lt;tex&amp;gt;max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] \times d[k+1][j]))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  &amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt;// d - матрица как в описании; a - последовательность из n элементов; i, j, k - счётчики&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  '''for''' i = 1 '''to''' n:&lt;br /&gt;
    d[i][i] = a[i];&lt;br /&gt;
  &lt;br /&gt;
  '''for''' i = n - 1 '''downto''' 1:&lt;br /&gt;
    '''for''' j = i + 1 '''to''' n:&lt;br /&gt;
      '''for''' k = i '''to''' j - 1:&lt;br /&gt;
        d[i][j] = max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] * d[k + 1][j]));&lt;br /&gt;
  &lt;br /&gt;
  '''print'''(d[1][n]);            &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// вывод ответа&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
Пусть дана последовательность &amp;lt;tex&amp;gt;2, 1, 1, 2&amp;lt;/tex&amp;gt;. Таблица &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; для неё будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
:{| border = 1; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;9&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Глава 15. Динамическое программирование // Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. В. Красикова. — 2-е изд. - 300стр. — М.: Вильямс, 2005. — 1296 с. — ISBN 5-8459-0857-4&lt;br /&gt;
http://fvn2009.narod.ru/Olympiads/Rules_Olympiads/Rules22.htm&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>Ruslan02</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61279</id>
		<title>Задача о расстановке знаков в выражении</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61279"/>
				<updated>2017-06-04T17:51:03Z</updated>
		
		<summary type="html">&lt;p&gt;Ruslan02: /* Реализация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ Задача&lt;br /&gt;
|definition = &lt;br /&gt;
Пусть задана последовательность неотрицательных чисел &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_1, a_2, \dots, a_n \ (a_i \ge 0)&amp;lt;/tex&amp;gt;. Требуется расставить знаки &amp;lt;tex dpi = &amp;quot;120&amp;quot;&amp;gt;+, \times&amp;lt;/tex&amp;gt; и скобки в последовательности, чтобы значение полученного арифметического выражения было максимальным.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Решение ==&lt;br /&gt;
Данная задача решается с использованием [[Динамическое_программирование | принципа оптимальности на подотрезках]]. Введём матрицу &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; будет равен максимальному значению, достигаемому на подотрезке &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_i, a_{i+1}, \dots, a_j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Получаем следующие соотношения: &amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][i] = a_i &amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k]+d[k+1][j], d[i][k] \times d[k+1][j])] \ (i &amp;lt; j)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Вычислим элементы таблицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, тогда ответом на задачу будет значение &amp;lt;tex&amp;gt;d[1][n]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Рассмотрим ее, например, в такой формулировке. В арифметическом выражении, операндами которого являются целые числа, а операциями — бинарные арифметические операции &amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;, расставить скобки так, чтобы результат оказался максимальным.&lt;br /&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;tex&amp;gt;d[i, j]&amp;lt;/tex&amp;gt; матрицы, размером &amp;lt;tex&amp;gt;n\times n&amp;lt;/tex&amp;gt;, диагональные элементы которой &amp;lt;tex&amp;gt;(d[i, i])&amp;lt;/tex&amp;gt; равны операндам, а для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; все элементы равны &amp;lt;tex&amp;gt;0&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;tex&amp;gt;i &amp;lt; j&amp;lt;/tex&amp;gt;. Если мы предположим, что последней будет выполняться арифметическая операция, расположенная после операнда с номером &amp;lt;tex&amp;gt;k (k &amp;lt; j)&amp;lt;/tex&amp;gt; и эта операция — сложение, то результат подсчета будет равен сумме элементов &amp;lt;tex&amp;gt;d[i, k]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d[k+1, j]&amp;lt;/tex&amp;gt; нашей матрицы. С умножением ситуация несколько более сложная. Так как операндами могут быть и отрицательные числа, то для нахождения максимума из произведений нужно знать не только максимальные, но и минимальные значения для арифметических операций над операндами с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-й и с &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;-й соответственно. Значит для любой последовательности операндов нужно хранить значение как максимально, так и минимально возможного результата выполнения арифметических операций над ними. Однако, дополнительная матрица для хранения минимальных значений не нужна. Так как для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; матрица &amp;lt;tex&amp;gt;d&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;tex&amp;gt;d[j, i]&amp;lt;/tex&amp;gt;. Тогда в общем случае, если после k-го операнда стоит операция умножения, то максимальный результат будет равен &amp;lt;tex&amp;gt;max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] \times d[k+1][j]))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  &amp;lt;font color = &amp;quot;green&amp;quot;&amp;gt;// d - матрица как в описании; a - последовательность из n элементов; i, j, k - счётчики&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  '''for''' i = 1 '''to''' n:&lt;br /&gt;
    d[i][i] = a[i];&lt;br /&gt;
  &lt;br /&gt;
  '''for''' i = n - 1 '''downto''' 1:&lt;br /&gt;
    '''for''' j = i + 1 '''to''' n:&lt;br /&gt;
      '''for''' k = i '''to''' j - 1:&lt;br /&gt;
        d[i][j] = max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] * d[k + 1][j]));&lt;br /&gt;
  &lt;br /&gt;
  '''write'''(d[1][n]);            &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// вывод ответа&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
Пусть дана последовательность &amp;lt;tex&amp;gt;2, 1, 1, 2&amp;lt;/tex&amp;gt;. Таблица &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; для неё будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
:{| border = 1; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;9&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Глава 15. Динамическое программирование // Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. В. Красикова. — 2-е изд. - 300стр. — М.: Вильямс, 2005. — 1296 с. — ISBN 5-8459-0857-4&lt;br /&gt;
http://fvn2009.narod.ru/Olympiads/Rules_Olympiads/Rules22.htm&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>Ruslan02</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61278</id>
		<title>Задача о расстановке знаков в выражении</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61278"/>
				<updated>2017-06-04T17:43:53Z</updated>
		
		<summary type="html">&lt;p&gt;Ruslan02: /* Пример */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ Задача&lt;br /&gt;
|definition = &lt;br /&gt;
Пусть задана последовательность неотрицательных чисел &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_1, a_2, \dots, a_n \ (a_i \ge 0)&amp;lt;/tex&amp;gt;. Требуется расставить знаки &amp;lt;tex dpi = &amp;quot;120&amp;quot;&amp;gt;+, \times&amp;lt;/tex&amp;gt; и скобки в последовательности, чтобы значение полученного арифметического выражения было максимальным.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Решение ==&lt;br /&gt;
Данная задача решается с использованием [[Динамическое_программирование | принципа оптимальности на подотрезках]]. Введём матрицу &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; будет равен максимальному значению, достигаемому на подотрезке &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_i, a_{i+1}, \dots, a_j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Получаем следующие соотношения: &amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][i] = a_i &amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k]+d[k+1][j], d[i][k] \times d[k+1][j])] \ (i &amp;lt; j)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Вычислим элементы таблицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, тогда ответом на задачу будет значение &amp;lt;tex&amp;gt;d[1][n]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Рассмотрим ее, например, в такой формулировке. В арифметическом выражении, операндами которого являются целые числа, а операциями — бинарные арифметические операции &amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;, расставить скобки так, чтобы результат оказался максимальным.&lt;br /&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;tex&amp;gt;d[i, j]&amp;lt;/tex&amp;gt; матрицы, размером &amp;lt;tex&amp;gt;n\times n&amp;lt;/tex&amp;gt;, диагональные элементы которой &amp;lt;tex&amp;gt;(d[i, i])&amp;lt;/tex&amp;gt; равны операндам, а для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; все элементы равны &amp;lt;tex&amp;gt;0&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;tex&amp;gt;i &amp;lt; j&amp;lt;/tex&amp;gt;. Если мы предположим, что последней будет выполняться арифметическая операция, расположенная после операнда с номером &amp;lt;tex&amp;gt;k (k &amp;lt; j)&amp;lt;/tex&amp;gt; и эта операция — сложение, то результат подсчета будет равен сумме элементов &amp;lt;tex&amp;gt;d[i, k]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d[k+1, j]&amp;lt;/tex&amp;gt; нашей матрицы. С умножением ситуация несколько более сложная. Так как операндами могут быть и отрицательные числа, то для нахождения максимума из произведений нужно знать не только максимальные, но и минимальные значения для арифметических операций над операндами с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-й и с &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;-й соответственно. Значит для любой последовательности операндов нужно хранить значение как максимально, так и минимально возможного результата выполнения арифметических операций над ними. Однако, дополнительная матрица для хранения минимальных значений не нужна. Так как для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; матрица &amp;lt;tex&amp;gt;d&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;tex&amp;gt;d[j, i]&amp;lt;/tex&amp;gt;. Тогда в общем случае, если после k-го операнда стоит операция умножения, то максимальный результат будет равен &amp;lt;tex&amp;gt;max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] \times d[k+1][j]))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // d - матрица как в описании; a - последовательность из n элементов; i, j, k - счётчики&lt;br /&gt;
  &lt;br /&gt;
  for i := 1 to n do&lt;br /&gt;
    d[i][i] := a[i];&lt;br /&gt;
  &lt;br /&gt;
  for i := n - 1 downto 1 do&lt;br /&gt;
    for j := i + 1 to n do&lt;br /&gt;
      for k := i to j - 1 do&lt;br /&gt;
        d[i][j] := max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] * d[k+1][j]));&lt;br /&gt;
  &lt;br /&gt;
  write(d[1][n]); // вывод ответа&lt;br /&gt;
== Пример ==&lt;br /&gt;
Пусть дана последовательность &amp;lt;tex&amp;gt;2, 1, 1, 2&amp;lt;/tex&amp;gt;. Таблица &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; для неё будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
:{| border = 1; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;9&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Глава 15. Динамическое программирование // Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. В. Красикова. — 2-е изд. - 300стр. — М.: Вильямс, 2005. — 1296 с. — ISBN 5-8459-0857-4&lt;br /&gt;
http://fvn2009.narod.ru/Olympiads/Rules_Olympiads/Rules22.htm&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>Ruslan02</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61277</id>
		<title>Задача о расстановке знаков в выражении</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61277"/>
				<updated>2017-06-04T17:42:52Z</updated>
		
		<summary type="html">&lt;p&gt;Ruslan02: /* Пример */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ Задача&lt;br /&gt;
|definition = &lt;br /&gt;
Пусть задана последовательность неотрицательных чисел &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_1, a_2, \dots, a_n \ (a_i \ge 0)&amp;lt;/tex&amp;gt;. Требуется расставить знаки &amp;lt;tex dpi = &amp;quot;120&amp;quot;&amp;gt;+, \times&amp;lt;/tex&amp;gt; и скобки в последовательности, чтобы значение полученного арифметического выражения было максимальным.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Решение ==&lt;br /&gt;
Данная задача решается с использованием [[Динамическое_программирование | принципа оптимальности на подотрезках]]. Введём матрицу &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; будет равен максимальному значению, достигаемому на подотрезке &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_i, a_{i+1}, \dots, a_j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Получаем следующие соотношения: &amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][i] = a_i &amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k]+d[k+1][j], d[i][k] \times d[k+1][j])] \ (i &amp;lt; j)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Вычислим элементы таблицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, тогда ответом на задачу будет значение &amp;lt;tex&amp;gt;d[1][n]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Рассмотрим ее, например, в такой формулировке. В арифметическом выражении, операндами которого являются целые числа, а операциями — бинарные арифметические операции &amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;, расставить скобки так, чтобы результат оказался максимальным.&lt;br /&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;tex&amp;gt;d[i, j]&amp;lt;/tex&amp;gt; матрицы, размером &amp;lt;tex&amp;gt;n\times n&amp;lt;/tex&amp;gt;, диагональные элементы которой &amp;lt;tex&amp;gt;(d[i, i])&amp;lt;/tex&amp;gt; равны операндам, а для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; все элементы равны &amp;lt;tex&amp;gt;0&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;tex&amp;gt;i &amp;lt; j&amp;lt;/tex&amp;gt;. Если мы предположим, что последней будет выполняться арифметическая операция, расположенная после операнда с номером &amp;lt;tex&amp;gt;k (k &amp;lt; j)&amp;lt;/tex&amp;gt; и эта операция — сложение, то результат подсчета будет равен сумме элементов &amp;lt;tex&amp;gt;d[i, k]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d[k+1, j]&amp;lt;/tex&amp;gt; нашей матрицы. С умножением ситуация несколько более сложная. Так как операндами могут быть и отрицательные числа, то для нахождения максимума из произведений нужно знать не только максимальные, но и минимальные значения для арифметических операций над операндами с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-й и с &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;-й соответственно. Значит для любой последовательности операндов нужно хранить значение как максимально, так и минимально возможного результата выполнения арифметических операций над ними. Однако, дополнительная матрица для хранения минимальных значений не нужна. Так как для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; матрица &amp;lt;tex&amp;gt;d&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;tex&amp;gt;d[j, i]&amp;lt;/tex&amp;gt;. Тогда в общем случае, если после k-го операнда стоит операция умножения, то максимальный результат будет равен &amp;lt;tex&amp;gt;max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] \times d[k+1][j]))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // d - матрица как в описании; a - последовательность из n элементов; i, j, k - счётчики&lt;br /&gt;
  &lt;br /&gt;
  for i := 1 to n do&lt;br /&gt;
    d[i][i] := a[i];&lt;br /&gt;
  &lt;br /&gt;
  for i := n - 1 downto 1 do&lt;br /&gt;
    for j := i + 1 to n do&lt;br /&gt;
      for k := i to j - 1 do&lt;br /&gt;
        d[i][j] := max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] * d[k+1][j]));&lt;br /&gt;
  &lt;br /&gt;
  write(d[1][n]); // вывод ответа&lt;br /&gt;
== Пример ==&lt;br /&gt;
Пусть дана последовательность &amp;lt;tex&amp;gt;2, 1, 1, 2&amp;lt;/tex&amp;gt;. Таблица &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; для неё будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
:{| border = 1; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;j = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;9&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Глава 15. Динамическое программирование // Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. В. Красикова. — 2-е изд. - 300стр. — М.: Вильямс, 2005. — 1296 с. — ISBN 5-8459-0857-4&lt;br /&gt;
http://fvn2009.narod.ru/Olympiads/Rules_Olympiads/Rules22.htm&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>Ruslan02</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61275</id>
		<title>Задача о расстановке знаков в выражении</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61275"/>
				<updated>2017-06-04T17:33:20Z</updated>
		
		<summary type="html">&lt;p&gt;Ruslan02: /* Решение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ Задача&lt;br /&gt;
|definition = &lt;br /&gt;
Пусть задана последовательность неотрицательных чисел &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_1, a_2, \dots, a_n \ (a_i \ge 0)&amp;lt;/tex&amp;gt;. Требуется расставить знаки &amp;lt;tex dpi = &amp;quot;120&amp;quot;&amp;gt;+, \times&amp;lt;/tex&amp;gt; и скобки в последовательности, чтобы значение полученного арифметического выражения было максимальным.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Решение ==&lt;br /&gt;
Данная задача решается с использованием [[Динамическое_программирование | принципа оптимальности на подотрезках]]. Введём матрицу &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; будет равен максимальному значению, достигаемому на подотрезке &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_i, a_{i+1}, \dots, a_j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Получаем следующие соотношения: &amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][i] = a_i &amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k]+d[k+1][j], d[i][k] \times d[k+1][j])] \ (i &amp;lt; j)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Вычислим элементы таблицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, тогда ответом на задачу будет значение &amp;lt;tex&amp;gt;d[1][n]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Рассмотрим ее, например, в такой формулировке. В арифметическом выражении, операндами которого являются целые числа, а операциями — бинарные арифметические операции &amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;, расставить скобки так, чтобы результат оказался максимальным.&lt;br /&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;tex&amp;gt;d[i, j]&amp;lt;/tex&amp;gt; матрицы, размером &amp;lt;tex&amp;gt;n\times n&amp;lt;/tex&amp;gt;, диагональные элементы которой &amp;lt;tex&amp;gt;(d[i, i])&amp;lt;/tex&amp;gt; равны операндам, а для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; все элементы равны &amp;lt;tex&amp;gt;0&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;tex&amp;gt;i &amp;lt; j&amp;lt;/tex&amp;gt;. Если мы предположим, что последней будет выполняться арифметическая операция, расположенная после операнда с номером &amp;lt;tex&amp;gt;k (k &amp;lt; j)&amp;lt;/tex&amp;gt; и эта операция — сложение, то результат подсчета будет равен сумме элементов &amp;lt;tex&amp;gt;d[i, k]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d[k+1, j]&amp;lt;/tex&amp;gt; нашей матрицы. С умножением ситуация несколько более сложная. Так как операндами могут быть и отрицательные числа, то для нахождения максимума из произведений нужно знать не только максимальные, но и минимальные значения для арифметических операций над операндами с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-й и с &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;-й соответственно. Значит для любой последовательности операндов нужно хранить значение как максимально, так и минимально возможного результата выполнения арифметических операций над ними. Однако, дополнительная матрица для хранения минимальных значений не нужна. Так как для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; матрица &amp;lt;tex&amp;gt;d&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;tex&amp;gt;d[j, i]&amp;lt;/tex&amp;gt;. Тогда в общем случае, если после k-го операнда стоит операция умножения, то максимальный результат будет равен &amp;lt;tex&amp;gt;max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] \times d[k+1][j]))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // d - матрица как в описании; a - последовательность из n элементов; i, j, k - счётчики&lt;br /&gt;
  &lt;br /&gt;
  for i := 1 to n do&lt;br /&gt;
    d[i][i] := a[i];&lt;br /&gt;
  &lt;br /&gt;
  for i := n - 1 downto 1 do&lt;br /&gt;
    for j := i + 1 to n do&lt;br /&gt;
      for k := i to j - 1 do&lt;br /&gt;
        d[i][j] := max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] * d[k+1][j]));&lt;br /&gt;
  &lt;br /&gt;
  write(d[1][n]); // вывод ответа&lt;br /&gt;
== Пример ==&lt;br /&gt;
Пусть дана последовательность 2, 1, 1, 2. Таблица &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; для неё будет выглядеть так:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;4&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| || j = 1 || j = 2 || j = 3 || j = 4&lt;br /&gt;
|-&lt;br /&gt;
| i = 1 || 2 || 3 || 4 || 9&lt;br /&gt;
|-&lt;br /&gt;
| i = 2 || 0 || 1 || 2 || 4&lt;br /&gt;
|-&lt;br /&gt;
| i = 3 || 0 || 0 || 1 || 3&lt;br /&gt;
|-&lt;br /&gt;
| i = 4 || 0 || 0 || 0 || 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Глава 15. Динамическое программирование // Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. В. Красикова. — 2-е изд. - 300стр. — М.: Вильямс, 2005. — 1296 с. — ISBN 5-8459-0857-4&lt;br /&gt;
http://fvn2009.narod.ru/Olympiads/Rules_Olympiads/Rules22.htm&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>Ruslan02</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61274</id>
		<title>Задача о расстановке знаков в выражении</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61274"/>
				<updated>2017-06-04T17:33:01Z</updated>
		
		<summary type="html">&lt;p&gt;Ruslan02: /* Решение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ Задача&lt;br /&gt;
|definition = &lt;br /&gt;
Пусть задана последовательность неотрицательных чисел &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_1, a_2, \dots, a_n \ (a_i \ge 0)&amp;lt;/tex&amp;gt;. Требуется расставить знаки &amp;lt;tex dpi = &amp;quot;120&amp;quot;&amp;gt;+, \times&amp;lt;/tex&amp;gt; и скобки в последовательности, чтобы значение полученного арифметического выражения было максимальным.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Решение ==&lt;br /&gt;
Данная задача решается с использованием [[Динамическое_программирование | принцип оптимальности на подотрезках]]. Введём матрицу &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; будет равен максимальному значению, достигаемому на подотрезке &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_i, a_{i+1}, \dots, a_j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Получаем следующие соотношения: &amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][i] = a_i &amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k]+d[k+1][j], d[i][k] \times d[k+1][j])] \ (i &amp;lt; j)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Вычислим элементы таблицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, тогда ответом на задачу будет значение &amp;lt;tex&amp;gt;d[1][n]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Рассмотрим ее, например, в такой формулировке. В арифметическом выражении, операндами которого являются целые числа, а операциями — бинарные арифметические операции &amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;, расставить скобки так, чтобы результат оказался максимальным.&lt;br /&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;tex&amp;gt;d[i, j]&amp;lt;/tex&amp;gt; матрицы, размером &amp;lt;tex&amp;gt;n\times n&amp;lt;/tex&amp;gt;, диагональные элементы которой &amp;lt;tex&amp;gt;(d[i, i])&amp;lt;/tex&amp;gt; равны операндам, а для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; все элементы равны &amp;lt;tex&amp;gt;0&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;tex&amp;gt;i &amp;lt; j&amp;lt;/tex&amp;gt;. Если мы предположим, что последней будет выполняться арифметическая операция, расположенная после операнда с номером &amp;lt;tex&amp;gt;k (k &amp;lt; j)&amp;lt;/tex&amp;gt; и эта операция — сложение, то результат подсчета будет равен сумме элементов &amp;lt;tex&amp;gt;d[i, k]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d[k+1, j]&amp;lt;/tex&amp;gt; нашей матрицы. С умножением ситуация несколько более сложная. Так как операндами могут быть и отрицательные числа, то для нахождения максимума из произведений нужно знать не только максимальные, но и минимальные значения для арифметических операций над операндами с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-й и с &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;-й соответственно. Значит для любой последовательности операндов нужно хранить значение как максимально, так и минимально возможного результата выполнения арифметических операций над ними. Однако, дополнительная матрица для хранения минимальных значений не нужна. Так как для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; матрица &amp;lt;tex&amp;gt;d&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;tex&amp;gt;d[j, i]&amp;lt;/tex&amp;gt;. Тогда в общем случае, если после k-го операнда стоит операция умножения, то максимальный результат будет равен &amp;lt;tex&amp;gt;max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] \times d[k+1][j]))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // d - матрица как в описании; a - последовательность из n элементов; i, j, k - счётчики&lt;br /&gt;
  &lt;br /&gt;
  for i := 1 to n do&lt;br /&gt;
    d[i][i] := a[i];&lt;br /&gt;
  &lt;br /&gt;
  for i := n - 1 downto 1 do&lt;br /&gt;
    for j := i + 1 to n do&lt;br /&gt;
      for k := i to j - 1 do&lt;br /&gt;
        d[i][j] := max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] * d[k+1][j]));&lt;br /&gt;
  &lt;br /&gt;
  write(d[1][n]); // вывод ответа&lt;br /&gt;
== Пример ==&lt;br /&gt;
Пусть дана последовательность 2, 1, 1, 2. Таблица &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; для неё будет выглядеть так:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;4&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| || j = 1 || j = 2 || j = 3 || j = 4&lt;br /&gt;
|-&lt;br /&gt;
| i = 1 || 2 || 3 || 4 || 9&lt;br /&gt;
|-&lt;br /&gt;
| i = 2 || 0 || 1 || 2 || 4&lt;br /&gt;
|-&lt;br /&gt;
| i = 3 || 0 || 0 || 1 || 3&lt;br /&gt;
|-&lt;br /&gt;
| i = 4 || 0 || 0 || 0 || 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Глава 15. Динамическое программирование // Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. В. Красикова. — 2-е изд. - 300стр. — М.: Вильямс, 2005. — 1296 с. — ISBN 5-8459-0857-4&lt;br /&gt;
http://fvn2009.narod.ru/Olympiads/Rules_Olympiads/Rules22.htm&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>Ruslan02</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61272</id>
		<title>Задача о расстановке знаков в выражении</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61272"/>
				<updated>2017-06-04T17:28:55Z</updated>
		
		<summary type="html">&lt;p&gt;Ruslan02: /* Доказательство */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ Задача&lt;br /&gt;
|definition = &lt;br /&gt;
Пусть задана последовательность неотрицательных чисел &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_1, a_2, \dots, a_n \ (a_i \ge 0)&amp;lt;/tex&amp;gt;. Требуется расставить знаки &amp;lt;tex dpi = &amp;quot;120&amp;quot;&amp;gt;+, \times&amp;lt;/tex&amp;gt; и скобки в последовательности, чтобы значение полученного арифметического выражения было максимальным.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Решение ==&lt;br /&gt;
Данная задача решается с использованием принципа оптимальности на подотрезке[http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5#.D0.9F.D1.80.D0.B8.D0.BD.D1.86.D0.B8.D0.BF_.D0.BE.D0.BF.D1.82.D0.B8.D0.BC.D0.B0.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8_.D0.BD.D0.B0_.D0.BF.D0.BE.D0.B4.D0.BE.D1.82.D1.80.D0.B5.D0.B7.D0.BA.D0.B0.D1.85]. Введём матрицу &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; будет равен максимальному значению, достигаемому на подотрезке &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_i, a_{i+1}, \dots, a_j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Получаем следующие соотношения: &amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][i] = a_i &amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k]+d[k+1][j], d[i][k] \times d[k+1][j])] \ (i &amp;lt; j)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Вычислим элементы таблицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, тогда ответом на задачу будет значение &amp;lt;tex&amp;gt;d[1][n]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Рассмотрим ее, например, в такой формулировке. В арифметическом выражении, операндами которого являются целые числа, а операциями — бинарные арифметические операции &amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\times&amp;lt;/tex&amp;gt;, расставить скобки так, чтобы результат оказался максимальным.&lt;br /&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;tex&amp;gt;d[i, j]&amp;lt;/tex&amp;gt; матрицы, размером &amp;lt;tex&amp;gt;n\times n&amp;lt;/tex&amp;gt;, диагональные элементы которой &amp;lt;tex&amp;gt;(d[i, i])&amp;lt;/tex&amp;gt; равны операндам, а для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; все элементы равны &amp;lt;tex&amp;gt;0&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;tex&amp;gt;i &amp;lt; j&amp;lt;/tex&amp;gt;. Если мы предположим, что последней будет выполняться арифметическая операция, расположенная после операнда с номером &amp;lt;tex&amp;gt;k (k &amp;lt; j)&amp;lt;/tex&amp;gt; и эта операция — сложение, то результат подсчета будет равен сумме элементов &amp;lt;tex&amp;gt;d[i, k]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;d[k+1, j]&amp;lt;/tex&amp;gt; нашей матрицы. С умножением ситуация несколько более сложная. Так как операндами могут быть и отрицательные числа, то для нахождения максимума из произведений нужно знать не только максимальные, но и минимальные значения для арифметических операций над операндами с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-й и с &amp;lt;tex&amp;gt;k+1&amp;lt;/tex&amp;gt;-го по &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;-й соответственно. Значит для любой последовательности операндов нужно хранить значение как максимально, так и минимально возможного результата выполнения арифметических операций над ними. Однако, дополнительная матрица для хранения минимальных значений не нужна. Так как для &amp;lt;tex&amp;gt;i &amp;gt; j&amp;lt;/tex&amp;gt; матрица &amp;lt;tex&amp;gt;d&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;tex&amp;gt;d[j, i]&amp;lt;/tex&amp;gt;. Тогда в общем случае, если после k-го операнда стоит операция умножения, то максимальный результат будет равен &amp;lt;tex&amp;gt;max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] \times d[k+1][j]))&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // d - матрица как в описании; a - последовательность из n элементов; i, j, k - счётчики&lt;br /&gt;
  &lt;br /&gt;
  for i := 1 to n do&lt;br /&gt;
    d[i][i] := a[i];&lt;br /&gt;
  &lt;br /&gt;
  for i := n - 1 downto 1 do&lt;br /&gt;
    for j := i + 1 to n do&lt;br /&gt;
      for k := i to j - 1 do&lt;br /&gt;
        d[i][j] := max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] * d[k+1][j]));&lt;br /&gt;
  &lt;br /&gt;
  write(d[1][n]); // вывод ответа&lt;br /&gt;
== Пример ==&lt;br /&gt;
Пусть дана последовательность 2, 1, 1, 2. Таблица &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; для неё будет выглядеть так:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;4&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| || j = 1 || j = 2 || j = 3 || j = 4&lt;br /&gt;
|-&lt;br /&gt;
| i = 1 || 2 || 3 || 4 || 9&lt;br /&gt;
|-&lt;br /&gt;
| i = 2 || 0 || 1 || 2 || 4&lt;br /&gt;
|-&lt;br /&gt;
| i = 3 || 0 || 0 || 1 || 3&lt;br /&gt;
|-&lt;br /&gt;
| i = 4 || 0 || 0 || 0 || 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Глава 15. Динамическое программирование // Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. В. Красикова. — 2-е изд. - 300стр. — М.: Вильямс, 2005. — 1296 с. — ISBN 5-8459-0857-4&lt;br /&gt;
http://fvn2009.narod.ru/Olympiads/Rules_Olympiads/Rules22.htm&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>Ruslan02</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61271</id>
		<title>Задача о расстановке знаков в выражении</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D1%80%D0%B0%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5_%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2_%D0%B2_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8&amp;diff=61271"/>
				<updated>2017-06-04T17:21:06Z</updated>
		
		<summary type="html">&lt;p&gt;Ruslan02: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ Задача&lt;br /&gt;
|definition = &lt;br /&gt;
Пусть задана последовательность неотрицательных чисел &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_1, a_2, \dots, a_n \ (a_i \ge 0)&amp;lt;/tex&amp;gt;. Требуется расставить знаки &amp;lt;tex dpi = &amp;quot;120&amp;quot;&amp;gt;+, \times&amp;lt;/tex&amp;gt; и скобки в последовательности, чтобы значение полученного арифметического выражения было максимальным.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Решение ==&lt;br /&gt;
Данная задача решается с использованием принципа оптимальности на подотрезке[http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5#.D0.9F.D1.80.D0.B8.D0.BD.D1.86.D0.B8.D0.BF_.D0.BE.D0.BF.D1.82.D0.B8.D0.BC.D0.B0.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D0.B8_.D0.BD.D0.B0_.D0.BF.D0.BE.D0.B4.D0.BE.D1.82.D1.80.D0.B5.D0.B7.D0.BA.D0.B0.D1.85]. Введём матрицу &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; размером &amp;lt;tex&amp;gt;n \times n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;d[i][j]&amp;lt;/tex&amp;gt; будет равен максимальному значению, достигаемому на подотрезке &amp;lt;tex dpi = &amp;quot;130&amp;quot;&amp;gt;a_i, a_{i+1}, \dots, a_j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Получаем следующие соотношения: &amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][i] = a_i &amp;lt;/tex&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k]+d[k+1][j], d[i][k] \times d[k+1][j])] \ (i &amp;lt; j)&amp;lt;/tex&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Вычислим элементы таблицы &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;, тогда ответом на задачу будет значение &amp;lt;tex&amp;gt;d[1][n]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
== Доказательство ==&lt;br /&gt;
Рассмотрим ее, например, в такой формулировке. В арифметическом выражении, операндами которого являются целые числа, а операциями — бинарные арифметические операции “+” и “*”, расставить скобки так, чтобы результат оказался максимальным.&lt;br /&gt;
Подзадачами, через которые мы будем выражать оптимальное решение, будут задачи об оптимальной расстановке скобок в произведениях наших операндов, начиная с i-го и заканчивая j-м. Запоминать результат оптимального решения соответствующей подзадачи мы будем в элементе d[i, j] матрицы, размером n*n, диагональные элементы которой (d[i, i]) равны операндам, а для i &amp;gt; j все элементы равны 0. Пусть мы хотим подсчитать значение арифметического выражения для операндов, начиная с i-го и заканчивая j-м для i &amp;lt; j. Если мы предположим, что последней будет выполняться арифметическая операция, расположенная после операнда с номером k (k &amp;lt; j) и эта операция — сложение, то результат подсчета будет равен сумме элементов d[i, k] и d[k+1, j] нашей матрицы. С умножением ситуация несколько более сложная. Так как операндами могут быть и отрицательные числа, то для нахождения максимума из произведений нужно знать не только максимальные, но и минимальные значения для арифметических операций над операндами с i-го по k-й и с k+1-го по j-й соответственно. Значит для любой последовательности операндов нужно хранить значение как максимально, так и минимально возможного результата выполнения арифметических операций над ними. Однако, дополнительная матрица для хранения минимальных значений не нужна. Так как для i &amp;gt; j матрица d не заполнена, мы можем отвести эти элементы для хранения минимумов, только запоминать результат решения этой подзадачи для операндов, начиная с i-го и заканчивая j-м, мы будем в элементе d[j, i]. Тогда в общем случае, если после k-го операнда стоит операция умножения, то максимальный результат будет равен max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] * d[k+1][j]));&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // d - матрица как в описании; a - последовательность из n элементов; i, j, k - счётчики&lt;br /&gt;
  &lt;br /&gt;
  for i := 1 to n do&lt;br /&gt;
    d[i][i] := a[i];&lt;br /&gt;
  &lt;br /&gt;
  for i := n - 1 downto 1 do&lt;br /&gt;
    for j := i + 1 to n do&lt;br /&gt;
      for k := i to j - 1 do&lt;br /&gt;
        d[i][j] := max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] * d[k+1][j]));&lt;br /&gt;
  &lt;br /&gt;
  write(d[1][n]); // вывод ответа&lt;br /&gt;
== Пример ==&lt;br /&gt;
Пусть дана последовательность 2, 1, 1, 2. Таблица &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; для неё будет выглядеть так:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=&amp;quot;4&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| || j = 1 || j = 2 || j = 3 || j = 4&lt;br /&gt;
|-&lt;br /&gt;
| i = 1 || 2 || 3 || 4 || 9&lt;br /&gt;
|-&lt;br /&gt;
| i = 2 || 0 || 1 || 2 || 4&lt;br /&gt;
|-&lt;br /&gt;
| i = 3 || 0 || 0 || 1 || 3&lt;br /&gt;
|-&lt;br /&gt;
| i = 4 || 0 || 0 || 0 || 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Глава 15. Динамическое программирование // Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. В. Красикова. — 2-е изд. - 300стр. — М.: Вильямс, 2005. — 1296 с. — ISBN 5-8459-0857-4&lt;br /&gt;
http://fvn2009.narod.ru/Olympiads/Rules_Olympiads/Rules22.htm&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория:Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>Ruslan02</name></author>	</entry>

	</feed>